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 02dd3666c2)
oldabi
Sean McGovern 14 years ago committed by Michael Niedermayer
parent fb8d710fa9
commit e4a2695856
  1. 19
      libavcodec/h264_mp4toannexb_bsf.c

@ -75,7 +75,7 @@ static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,
if (!ctx->extradata_parsed) { if (!ctx->extradata_parsed) {
uint16_t unit_size; uint16_t unit_size;
uint64_t total_size = 0; 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; const uint8_t *extradata = avctx->extradata+4;
static const uint8_t nalu_header[4] = {0, 0, 0, 1}; 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) { if (!unit_nb) {
unit_nb = *extradata++; /* number of pps unit(s) */ unit_nb = *extradata++; /* number of pps unit(s) */
sps_done++; sps_done++;
if (unit_nb)
pps_seen = 1;
}
else
{
sps_seen = 1;
} }
while (unit_nb--) { while (unit_nb--) {
void *tmp; void *tmp;
@ -114,7 +122,14 @@ static int h264_mp4toannexb_filter(AVBitStreamFilterContext *bsfc,
unit_nb = *extradata++; /* number of pps unit(s) */ 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); av_free(avctx->extradata);
avctx->extradata = out; avctx->extradata = out;
avctx->extradata_size = total_size; avctx->extradata_size = total_size;

Loading…
Cancel
Save