avformat/flvdec: add support for legacy HEVC files

This commit is contained in:
Timo Rothenpieler 2025-01-10 21:41:55 +01:00
parent 5cd49e1bfd
commit b76053d8bf
3 changed files with 8 additions and 3 deletions

View file

@ -117,6 +117,9 @@ enum {
FLV_CODECID_H264 = 7, FLV_CODECID_H264 = 7,
FLV_CODECID_REALH263= 8, FLV_CODECID_REALH263= 8,
FLV_CODECID_MPEG4 = 9, FLV_CODECID_MPEG4 = 9,
// non-standard protocol extension that is in use in the wild
FLV_CODECID_X_HEVC = 12,
}; };
enum { enum {

View file

@ -381,6 +381,7 @@ static int flv_same_video_codec(AVCodecParameters *vpar, uint32_t flv_codecid)
return 1; return 1;
switch (flv_codecid) { switch (flv_codecid) {
case FLV_CODECID_X_HEVC:
case MKBETAG('h', 'v', 'c', '1'): case MKBETAG('h', 'v', 'c', '1'):
return vpar->codec_id == AV_CODEC_ID_HEVC; return vpar->codec_id == AV_CODEC_ID_HEVC;
case MKBETAG('a', 'v', '0', '1'): case MKBETAG('a', 'v', '0', '1'):
@ -414,6 +415,7 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
enum AVCodecID old_codec_id = vstream->codecpar->codec_id; enum AVCodecID old_codec_id = vstream->codecpar->codec_id;
switch (flv_codecid) { switch (flv_codecid) {
case FLV_CODECID_X_HEVC:
case MKBETAG('h', 'v', 'c', '1'): case MKBETAG('h', 'v', 'c', '1'):
par->codec_id = AV_CODEC_ID_HEVC; par->codec_id = AV_CODEC_ID_HEVC;
vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; vstreami->need_parsing = AVSTREAM_PARSE_HEADERS;
@ -1660,8 +1662,8 @@ retry_duration:
} }
if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || if (st->codecpar->codec_id == AV_CODEC_ID_MPEG4 ||
(st->codecpar->codec_id == AV_CODEC_ID_H264 && (!enhanced_flv || type == PacketTypeCodedFrames)) || ((st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC) &&
(st->codecpar->codec_id == AV_CODEC_ID_HEVC && type == PacketTypeCodedFrames)) { (!enhanced_flv || type == PacketTypeCodedFrames))) {
// sign extension // sign extension
int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000;
pts = av_sat_add64(dts, cts); pts = av_sat_add64(dts, cts);

View file

@ -32,7 +32,7 @@
#include "version_major.h" #include "version_major.h"
#define LIBAVFORMAT_VERSION_MINOR 9 #define LIBAVFORMAT_VERSION_MINOR 9
#define LIBAVFORMAT_VERSION_MICRO 104 #define LIBAVFORMAT_VERSION_MICRO 105
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ LIBAVFORMAT_VERSION_MINOR, \