diff options
author | wm4 <nfxjfg@googlemail.com> | 2013-07-18 15:45:35 +0200 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2013-07-19 12:14:23 +0200 |
commit | 06b269dacbe172b5d5c7283a0f70498ba065b77e (patch) | |
tree | 75034e9e4ae982afbf9c3d1719a39ed5b0c557fb /doc/examples | |
parent | 25ffaf52770253a5bfce353dc3d30637664e5e60 (diff) | |
download | ffmpeg-06b269dacbe172b5d5c7283a0f70498ba065b77e.tar.gz |
examples: demuxing: do partial audio packet decoding
This assumes one audio packet is decoded one time. This is not true:
packets can be partially decoded. Then you have to "adjust" the packet
and pass the undecoded part of the packet to the decode function again.
Diffstat (limited to 'doc/examples')
-rw-r--r-- | doc/examples/demuxing.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/doc/examples/demuxing.c b/doc/examples/demuxing.c index 8a1b69bcf5..1c0f1ff40c 100644 --- a/doc/examples/demuxing.c +++ b/doc/examples/demuxing.c @@ -60,6 +60,7 @@ static int audio_frame_count = 0; static int decode_packet(int *got_frame, int cached) { int ret = 0; + int decoded = pkt.size; if (pkt.stream_index == video_stream_idx) { /* decode video frame */ @@ -91,6 +92,11 @@ static int decode_packet(int *got_frame, int cached) fprintf(stderr, "Error decoding audio frame\n"); return ret; } + /* Some audio decoders decode only part of the packet, and have to be + * called again with the remainder of the packet data. + * Sample: fate-suite/lossless-audio/luckynight-partial.shn + * Also, some decoders might over-read the packet. */ + decoded = FFMIN(ret, pkt.size); if (*got_frame) { printf("audio_frame%s n:%d nb_samples:%d pts:%s\n", @@ -121,7 +127,7 @@ static int decode_packet(int *got_frame, int cached) } } - return ret; + return decoded; } static int open_codec_context(int *stream_idx, @@ -293,8 +299,15 @@ int main (int argc, char **argv) /* read frames from the file */ while (av_read_frame(fmt_ctx, &pkt) >= 0) { - decode_packet(&got_frame, 0); - av_free_packet(&pkt); + AVPacket orig_pkt = pkt; + do { + ret = decode_packet(&got_frame, 0); + if (ret < 0) + break; + pkt.data += ret; + pkt.size -= ret; + } while (pkt.size > 0); + av_free_packet(&orig_pkt); } /* flush cached frames */ |