summaryrefslogtreecommitdiffstats
path: root/libavcodec/extract_extradata_bsf.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-04-14 10:53:52 -0300
committerAnton Khirnov <anton@khirnov.net>2017-05-20 09:41:30 +0200
commitd7dcd825dea3681c69a35b3147a3b42f1bf078dd (patch)
tree45d13636ea0365154fa8117680abaebd60f15c9b /libavcodec/extract_extradata_bsf.c
parent3fb6b98b5e247434456916c35ba7e08efa03e85d (diff)
downloadffmpeg-streaming-d7dcd825dea3681c69a35b3147a3b42f1bf078dd.zip
ffmpeg-streaming-d7dcd825dea3681c69a35b3147a3b42f1bf078dd.tar.gz
extract_extradata_bsf: make sure all needed parameter set NALUs were found
This mimics the behavior of the now unused h264/hevc parser's split() function and fixes decoding some files when extract_extradata bsf is enabled. Signed-off-by: James Almer <jamrial@gmail.com> Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavcodec/extract_extradata_bsf.c')
-rw-r--r--libavcodec/extract_extradata_bsf.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
index 20b3080..20840bd 100644
--- a/libavcodec/extract_extradata_bsf.c
+++ b/libavcodec/extract_extradata_bsf.c
@@ -65,7 +65,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
int extradata_size = 0;
const int *extradata_nal_types;
int nb_extradata_nal_types;
- int i, ret = 0;
+ int i, has_sps = 0, has_vps = 0, ret = 0;
if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
extradata_nal_types = extradata_nal_types_hevc;
@@ -82,11 +82,20 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
for (i = 0; i < h2645_pkt.nb_nals; i++) {
H2645NAL *nal = &h2645_pkt.nals[i];
- if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type))
+ if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type)) {
extradata_size += nal->raw_size + 3;
+ if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
+ if (nal->type == HEVC_NAL_SPS) has_sps = 1;
+ if (nal->type == HEVC_NAL_VPS) has_vps = 1;
+ } else {
+ if (nal->type == H264_NAL_SPS) has_sps = 1;
+ }
+ }
}
- if (extradata_size) {
+ if (extradata_size &&
+ ((ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
+ (ctx->par_in->codec_id == AV_CODEC_ID_H264 && has_sps))) {
AVBufferRef *filtered_buf;
uint8_t *extradata, *filtered_data;
OpenPOWER on IntegriCloud