doc/examples/filtering_audio: fix chunked audio decoding

Support the case when multiple frames are contained in a single packet.
In particular, fix fate-samples/lossless-audio/luckynight-partial.shn
sample decoding.
This commit is contained in:
Stefano Sabatini 2013-12-02 15:21:52 +01:00
parent 893f33e7f0
commit c490cd4c1a
1 changed files with 15 additions and 4 deletions

View File

@ -196,7 +196,7 @@ static void print_frame(const AVFrame *frame)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret; int ret;
AVPacket packet; AVPacket packet0, packet;
AVFrame *frame = av_frame_alloc(); AVFrame *frame = av_frame_alloc();
AVFrame *filt_frame = av_frame_alloc(); AVFrame *filt_frame = av_frame_alloc();
int got_frame; int got_frame;
@ -220,9 +220,13 @@ int main(int argc, char **argv)
goto end; goto end;
/* read all packets */ /* read all packets */
packet.data = NULL;
while (1) { while (1) {
if ((ret = av_read_frame(fmt_ctx, &packet)) < 0) if (!packet0.data) {
break; if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
break;
packet0 = packet;
}
if (packet.stream_index == audio_stream_index) { if (packet.stream_index == audio_stream_index) {
avcodec_get_frame_defaults(frame); avcodec_get_frame_defaults(frame);
@ -232,6 +236,8 @@ int main(int argc, char **argv)
av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n"); av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n");
continue; continue;
} }
packet.size -= ret;
packet.data += ret;
if (got_frame) { if (got_frame) {
/* push the audio data from decoded frame into the filtergraph */ /* push the audio data from decoded frame into the filtergraph */
@ -251,8 +257,13 @@ int main(int argc, char **argv)
av_frame_unref(filt_frame); av_frame_unref(filt_frame);
} }
} }
if (packet.size <= 0)
av_free_packet(&packet0);
} else {
/* discard non-wanted packets */
av_free_packet(&packet0);
} }
av_free_packet(&packet);
} }
end: end:
avfilter_graph_free(&filter_graph); avfilter_graph_free(&filter_graph);