aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean McGovern <gseanmcg@gmail.com>2011-03-03 22:22:43 -0500
committerMichael Niedermayer <michaelni@gmx.at>2011-03-08 02:09:16 +0100
commite4a2695856dad2333376739a2dca23da82dc2aa6 (patch)
treede195de9831fb96515050aab4401991789e53529
parentfb8d710fa976828d99496c8a9ac1790627adb4ad (diff)
downloadffmpeg-e4a2695856dad2333376739a2dca23da82dc2aa6.tar.gz
h264_mp3toannexb_bsg: don't crash, but warn, if PPS/SPS not found.
Should an AVC-1 in MP4 stream not contain SPS or PPS NAL units, this BSF is then unable to allocate an output buffer for the modified stream. Warn that the resulting stream may be unplayable. Fix roundup issue #2386. Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com> (cherry picked from commit 02dd3666c2944a3db44ba13916ba40dbdd41f9b1)
-rw-r--r--libavcodec/h264_mp4toannexb_bsf.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/libavcodec/h264_mp4toannexb_bsf.c b/libavcodec/h264_mp4toannexb_bsf.c
index d4a7f31937..e7f2e7ab04 100644
--- a/libavcodec/h264_mp4toannexb_bsf.c
+++ b/libavcodec/h264_mp4toannexb_bsf.c
@@ -75,7 +75,7 @@ static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,
if (!ctx->extradata_parsed) {
uint16_t unit_size;
uint64_t total_size = 0;
- uint8_t *out = NULL, unit_nb, sps_done = 0;
+ uint8_t *out = NULL, unit_nb, sps_done = 0, sps_seen = 0, pps_seen = 0;
const uint8_t *extradata = avctx->extradata+4;
static const uint8_t nalu_header[4] = {0, 0, 0, 1};
@@ -89,7 +89,15 @@ static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,
if (!unit_nb) {
unit_nb = *extradata++; /* number of pps unit(s) */
sps_done++;
+
+ if (unit_nb)
+ pps_seen = 1;
+ }
+ else
+ {
+ sps_seen = 1;
}
+
while (unit_nb--) {
void *tmp;
@@ -114,7 +122,14 @@ static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,
unit_nb = *extradata++; /* number of pps unit(s) */
}
- memset(out + total_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+ if(out)
+ memset(out + total_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+
+ if (!sps_seen)
+ av_log(avctx, AV_LOG_WARNING, "Warning: SPS NALU missing or invalid. The resulting stream may not play.\n");
+ if (!pps_seen)
+ av_log(avctx, AV_LOG_WARNING, "Warning: PPS NALU missing or invalid. The resulting stream may not play.\n");
+
av_free(avctx->extradata);
avctx->extradata = out;
avctx->extradata_size = total_size;