avformat/mpegtsenc: refact mpegts_check_bitstream to loop up table

Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Nuo Mi 2024-01-30 20:48:59 +08:00
parent aa3155e4c2
commit 8559cce3c3
1 changed files with 18 additions and 15 deletions

View File

@ -2257,23 +2257,26 @@ static void mpegts_deinit(AVFormatContext *s)
static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st, static int mpegts_check_bitstream(AVFormatContext *s, AVStream *st,
const AVPacket *pkt) const AVPacket *pkt)
{ {
int ret = 1; const struct Entry {
enum AVCodecID id;
const char *bsf_name;
uint8_t mask;
uint8_t value;
} list[] = {
{ AV_CODEC_ID_H264, "h264_mp4toannexb", 0xff, 0x01 /* configurationVersion in AVCDecoderConfigurationRecord */},
{ AV_CODEC_ID_HEVC, "hevc_mp4toannexb", 0xff, 0x01 /* configurationVersion in HEVCDecoderConfigurationRecord */},
};
if (st->codecpar->codec_id == AV_CODEC_ID_H264) { for (int i = 0; i < FF_ARRAY_ELEMS(list); i++) {
if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && const struct Entry *e = list + i;
if (e->id == st->codecpar->codec_id &&
pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
(AV_RB24(pkt->data) != 0x000001 || (AV_RB24(pkt->data) != 0x000001 ||
(st->codecpar->extradata_size > 0 && (st->codecpar->extradata_size > 0 &&
st->codecpar->extradata[0] == 1))) (st->codecpar->extradata[0] & e->mask == e->value))))
ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL); return ff_stream_add_bitstream_filter(st, e->bsf_name, NULL);
} else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC) {
if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
(AV_RB24(pkt->data) != 0x000001 ||
(st->codecpar->extradata_size > 0 &&
st->codecpar->extradata[0] == 1)))
ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL);
} }
return 1;
return ret;
} }
#define OFFSET(x) offsetof(MpegTSWrite, x) #define OFFSET(x) offsetof(MpegTSWrite, x)