decoder/ffmpeg: use avcodec_decode_audio3() if available

avcodec_decode_audio3() has been added in libavformat 52.25.0, and the
predecessor avcodec_decode_audio2() has been deprecated.
This commit is contained in:
Max Kellermann 2011-04-12 08:16:57 +02:00
parent eaf414cbc8
commit 246db3d565
2 changed files with 23 additions and 2 deletions

2
NEWS
View File

@ -1,7 +1,7 @@
ver 0.16.3 (2011/??/??) ver 0.16.3 (2011/??/??)
* fix assertion failure in audio format mask parser * fix assertion failure in audio format mask parser
* decoder: * decoder:
- ffmpeg: support lavc 53 - ffmpeg: support libavcodec 0.7
ver 0.16.2 (2011/03/18) ver 0.16.2 (2011/03/18)

View File

@ -194,19 +194,35 @@ ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is,
av_rescale_q(packet->pts, *time_base, av_rescale_q(packet->pts, *time_base,
(AVRational){1, 1})); (AVRational){1, 1}));
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,25,0)
AVPacket packet2 = *packet;
#else
const uint8_t *packet_data = packet->data; const uint8_t *packet_data = packet->data;
int packet_size = packet->size; int packet_size = packet->size;
#endif
uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2 + 16]; uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2 + 16];
size_t buffer_size = sizeof(audio_buf); size_t buffer_size = sizeof(audio_buf);
int16_t *aligned_buffer = align16(audio_buf, &buffer_size); int16_t *aligned_buffer = align16(audio_buf, &buffer_size);
enum decoder_command cmd = DECODE_COMMAND_NONE; enum decoder_command cmd = DECODE_COMMAND_NONE;
while ((packet_size > 0) && (cmd == DECODE_COMMAND_NONE)) { while (
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,25,0)
packet2.size > 0 &&
#else
packet_size > 0 &&
#endif
cmd == DECODE_COMMAND_NONE) {
int audio_size = buffer_size; int audio_size = buffer_size;
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,25,0)
int len = avcodec_decode_audio3(codec_context,
aligned_buffer, &audio_size,
&packet2);
#else
int len = avcodec_decode_audio2(codec_context, int len = avcodec_decode_audio2(codec_context,
aligned_buffer, &audio_size, aligned_buffer, &audio_size,
packet_data, packet_size); packet_data, packet_size);
#endif
if (len < 0) { if (len < 0) {
/* if error, we skip the frame */ /* if error, we skip the frame */
@ -214,8 +230,13 @@ ffmpeg_send_packet(struct decoder *decoder, struct input_stream *is,
break; break;
} }
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,25,0)
packet2.data += len;
packet2.size -= len;
#else
packet_data += len; packet_data += len;
packet_size -= len; packet_size -= len;
#endif
if (audio_size <= 0) if (audio_size <= 0)
continue; continue;