mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
893f33e7f0
commit
c490cd4c1a
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue