pkgsrc/multimedia/transcode/patches/patch-export_aud__aux.c
2019-12-29 10:23:53 +00:00

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) {