mirror of https://git.ffmpeg.org/ffmpeg.git
cbs_h264: Add support for filler NAL units
This commit is contained in:
parent
7157d95926
commit
eccc03c8fb
|
@ -408,6 +408,12 @@ typedef struct H264RawSlice {
|
||||||
AVBufferRef *data_ref;
|
AVBufferRef *data_ref;
|
||||||
} H264RawSlice;
|
} H264RawSlice;
|
||||||
|
|
||||||
|
typedef struct H264RawFiller {
|
||||||
|
H264RawNALUnitHeader nal_unit_header;
|
||||||
|
|
||||||
|
uint32_t filler_size;
|
||||||
|
} H264RawFiller;
|
||||||
|
|
||||||
|
|
||||||
typedef struct CodedBitstreamH264Context {
|
typedef struct CodedBitstreamH264Context {
|
||||||
// Reader/writer context in common with the H.265 implementation.
|
// Reader/writer context in common with the H.265 implementation.
|
||||||
|
|
|
@ -815,6 +815,19 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case H264_NAL_FILLER_DATA:
|
||||||
|
{
|
||||||
|
err = ff_cbs_alloc_unit_content(ctx, unit,
|
||||||
|
sizeof(H264RawFiller), NULL);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
err = cbs_h264_read_filler(ctx, &bc, unit->content);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return AVERROR(ENOSYS);
|
return AVERROR(ENOSYS);
|
||||||
}
|
}
|
||||||
|
@ -1070,6 +1083,14 @@ static int cbs_h264_write_nal_unit(CodedBitstreamContext *ctx,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case H264_NAL_FILLER_DATA:
|
||||||
|
{
|
||||||
|
err = cbs_h264_write_filler(ctx, pbc, unit->content);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for "
|
av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for "
|
||||||
"NAL unit type %"PRIu32".\n", unit->type);
|
"NAL unit type %"PRIu32".\n", unit->type);
|
||||||
|
|
|
@ -1247,3 +1247,32 @@ static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int FUNC(filler)(CodedBitstreamContext *ctx, RWContext *rw,
|
||||||
|
H264RawFiller *current)
|
||||||
|
{
|
||||||
|
av_unused int ff_byte = 0xff;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
HEADER("Filler Data");
|
||||||
|
|
||||||
|
CHECK(FUNC(nal_unit_header)(ctx, rw, ¤t->nal_unit_header,
|
||||||
|
1 << H264_NAL_FILLER_DATA));
|
||||||
|
|
||||||
|
#ifdef READ
|
||||||
|
while (bitstream_peek(rw, 8) == 0xff) {
|
||||||
|
xu(8, ff_byte, ff_byte, 0xff, 0xff);
|
||||||
|
++current->filler_size;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0; i < current->filler_size; i++)
|
||||||
|
xu(8, ff_byte, ff_byte, 0xff, 0xff);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CHECK(FUNC(rbsp_trailing_bits)(ctx, rw));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue