Sequence End units (or actually, sequence_end_codes) have up until now not been decomposed; in fact due to a bug in cbs_mpeg2_split_fragment they have mostly been treated as part of the preceding unit. So implement decomposing them as preparation for fixing said bug. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>tags/n4.3
@@ -269,6 +269,8 @@ static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx, | |||||
extension_data, NULL); | extension_data, NULL); | ||||
START(MPEG2_START_GROUP, MPEG2RawGroupOfPicturesHeader, | START(MPEG2_START_GROUP, MPEG2RawGroupOfPicturesHeader, | ||||
group_of_pictures_header, NULL); | group_of_pictures_header, NULL); | ||||
START(MPEG2_START_SEQUENCE_END, MPEG2RawSequenceEnd, | |||||
sequence_end, NULL); | |||||
#undef START | #undef START | ||||
default: | default: | ||||
return AVERROR(ENOSYS); | return AVERROR(ENOSYS); | ||||
@@ -295,6 +297,7 @@ static int cbs_mpeg2_write_header(CodedBitstreamContext *ctx, | |||||
START(MPEG2_START_EXTENSION, MPEG2RawExtensionData, extension_data); | START(MPEG2_START_EXTENSION, MPEG2RawExtensionData, extension_data); | ||||
START(MPEG2_START_GROUP, MPEG2RawGroupOfPicturesHeader, | START(MPEG2_START_GROUP, MPEG2RawGroupOfPicturesHeader, | ||||
group_of_pictures_header); | group_of_pictures_header); | ||||
START(MPEG2_START_SEQUENCE_END, MPEG2RawSequenceEnd, sequence_end); | |||||
#undef START | #undef START | ||||
default: | default: | ||||
av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for start " | av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for start " | ||||
@@ -212,6 +212,10 @@ typedef struct MPEG2RawSlice { | |||||
AVBufferRef *data_ref; | AVBufferRef *data_ref; | ||||
} MPEG2RawSlice; | } MPEG2RawSlice; | ||||
typedef struct MPEG2RawSequenceEnd { | |||||
uint8_t sequence_end_code; | |||||
} MPEG2RawSequenceEnd; | |||||
typedef struct CodedBitstreamMPEG2Context { | typedef struct CodedBitstreamMPEG2Context { | ||||
// Elements stored in headers which are required for other decoding. | // Elements stored in headers which are required for other decoding. | ||||
@@ -411,3 +411,15 @@ static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw, | |||||
return 0; | return 0; | ||||
} | } | ||||
static int FUNC(sequence_end)(CodedBitstreamContext *ctx, RWContext *rw, | |||||
MPEG2RawSequenceEnd *current) | |||||
{ | |||||
int err; | |||||
HEADER("Sequence End"); | |||||
ui(8, sequence_end_code); | |||||
return 0; | |||||
} |