summaryrefslogtreecommitdiff
path: root/doc/examples
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2013-07-18 15:45:35 +0200
committerStefano Sabatini <stefasab@gmail.com>2013-07-19 12:14:23 +0200
commit06b269dacbe172b5d5c7283a0f70498ba065b77e (patch)
tree75034e9e4ae982afbf9c3d1719a39ed5b0c557fb /doc/examples
parent25ffaf52770253a5bfce353dc3d30637664e5e60 (diff)
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.c19
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 */