104 lines
3.7 KiB
C
104 lines
3.7 KiB
C
$NetBSD: patch-export_aud__aux.c,v 1.2 2019/12/29 10:23:53 markd Exp $
|
|
|
|
Fixes building against FFmpeg version >= 4.0.0 (gentoo patch).
|
|
|
|
--- export/aud_aux.c.orig 2011-11-19 16:50:27.000000000 +0000
|
|
+++ export/aud_aux.c
|
|
@@ -326,10 +326,10 @@ static int tc_audio_init_ffmpeg(vob_t *v
|
|
|
|
switch (o_codec) {
|
|
case 0x50:
|
|
- codeid = CODEC_ID_MP2;
|
|
+ codeid = AV_CODEC_ID_MP2;
|
|
break;
|
|
case 0x2000:
|
|
- codeid = CODEC_ID_AC3;
|
|
+ codeid = AV_CODEC_ID_AC3;
|
|
break;
|
|
default:
|
|
tc_warn("cannot init ffmpeg with %x", o_codec);
|
|
@@ -346,7 +346,7 @@ static int tc_audio_init_ffmpeg(vob_t *v
|
|
|
|
//-- set parameters (bitrate, channels and sample-rate) --
|
|
//--------------------------------------------------------
|
|
- avcodec_get_context_defaults(&mpa_ctx);
|
|
+ avcodec_get_context_defaults3(&mpa_ctx, mpa_codec);
|
|
#if LIBAVCODEC_VERSION_MAJOR < 53
|
|
mpa_ctx.codec_type = CODEC_TYPE_AUDIO;
|
|
#else
|
|
@@ -359,11 +359,11 @@ static int tc_audio_init_ffmpeg(vob_t *v
|
|
//-- open codec --
|
|
//----------------
|
|
TC_LOCK_LIBAVCODEC;
|
|
- ret = avcodec_open(&mpa_ctx, mpa_codec);
|
|
+ ret = avcodec_open2(&mpa_ctx, mpa_codec, NULL);
|
|
TC_UNLOCK_LIBAVCODEC;
|
|
if (ret < 0) {
|
|
tc_warn("tc_audio_init_ffmpeg: could not open %s codec !",
|
|
- (codeid == CODEC_ID_MP2) ?"mpa" :"ac3");
|
|
+ (codeid == AV_CODEC_ID_MP2) ?"mpa" :"ac3");
|
|
return(TC_EXPORT_ERROR);
|
|
}
|
|
|
|
@@ -846,6 +846,9 @@ static int tc_audio_encode_ffmpeg(char *
|
|
#ifdef HAVE_FFMPEG
|
|
int in_size, out_size;
|
|
char *in_buf;
|
|
+ int got_packet;
|
|
+ AVPacket avpkt = { 0 };
|
|
+ AVFrame *frame = av_frame_alloc();
|
|
|
|
//-- input buffer and amount of bytes --
|
|
in_size = aud_size;
|
|
@@ -866,10 +869,14 @@ static int tc_audio_encode_ffmpeg(char *
|
|
|
|
ac_memcpy(&mpa_buf[mpa_buf_ptr], in_buf, bytes_needed);
|
|
|
|
+ frame->nb_samples = mpa_ctx.frame_size;
|
|
+ avcodec_fill_audio_frame(frame, mpa_ctx.channels, mpa_ctx.sample_fmt, (const uint8_t *)mpa_buf, mpa_bytes_pf, 1);
|
|
+ avpkt.data = output;
|
|
+ avpkt.size = OUTPUT_SIZE;
|
|
TC_LOCK_LIBAVCODEC;
|
|
- out_size = avcodec_encode_audio(&mpa_ctx, (unsigned char *)output,
|
|
- OUTPUT_SIZE, (short *)mpa_buf);
|
|
+ out_size = avcodec_encode_audio2(&mpa_ctx, &avpkt, frame, &got_packet);
|
|
TC_UNLOCK_LIBAVCODEC;
|
|
+ out_size = avpkt.size;
|
|
tc_audio_write(output, out_size, avifile);
|
|
|
|
in_size -= bytes_needed;
|
|
@@ -884,6 +891,7 @@ static int tc_audio_encode_ffmpeg(char *
|
|
|
|
ac_memcpy(&mpa_buf[mpa_buf_ptr], aud_buffer, bytes_avail);
|
|
mpa_buf_ptr += bytes_avail;
|
|
+ av_frame_free(&frame);
|
|
return (0);
|
|
}
|
|
} //bytes availabe from last call?
|
|
@@ -893,10 +901,15 @@ static int tc_audio_encode_ffmpeg(char *
|
|
//----------------------------------------------------
|
|
|
|
while (in_size >= mpa_bytes_pf) {
|
|
+ av_frame_unref(frame);
|
|
+ frame->nb_samples = mpa_ctx.frame_size;
|
|
+ avcodec_fill_audio_frame(frame, mpa_ctx.channels, mpa_ctx.sample_fmt, (const uint8_t *)in_buf, mpa_bytes_pf, 1);
|
|
+ avpkt.data = output;
|
|
+ avpkt.size = OUTPUT_SIZE;
|
|
TC_LOCK_LIBAVCODEC;
|
|
- out_size = avcodec_encode_audio(&mpa_ctx, (unsigned char *)output,
|
|
- OUTPUT_SIZE, (short *)in_buf);
|
|
+ out_size = avcodec_encode_audio2(&mpa_ctx, &avpkt, frame, &got_packet);
|
|
TC_UNLOCK_LIBAVCODEC;
|
|
+ out_size = avpkt.size;
|
|
|
|
tc_audio_write(output, out_size, avifile);
|
|
|
|
@@ -904,6 +917,8 @@ static int tc_audio_encode_ffmpeg(char *
|
|
in_buf += mpa_bytes_pf;
|
|
}
|
|
|
|
+ av_frame_free(&frame);
|
|
+
|
|
//-- hold rest of bytes in mpa-buffer --
|
|
//--------------------------------------
|
|
if (in_size > 0) {
|