-
Notifications
You must be signed in to change notification settings - Fork 737
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add support for HEVC and Opus to FLV format in presets for FFmpeg …
…(pull #1228)
- Loading branch information
1 parent
70e6525
commit 95b831f
Showing
3 changed files
with
221 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,219 @@ | ||
diff -ruN ffmpeg-5.1.1/libavformat/flv.h ffmpeg-5.1.1-patch/libavformat/flv.h | ||
--- ffmpeg-5.1.1/libavformat/flv.h 2022-07-23 01:58:39.000000000 +0800 | ||
+++ ffmpeg-5.1.1-patch/libavformat/flv.h 2022-09-13 20:06:17.000000000 +0800 | ||
@@ -99,6 +99,7 @@ | ||
FLV_CODECID_PCM_MULAW = 8 << FLV_AUDIO_CODECID_OFFSET, | ||
FLV_CODECID_AAC = 10<< FLV_AUDIO_CODECID_OFFSET, | ||
FLV_CODECID_SPEEX = 11<< FLV_AUDIO_CODECID_OFFSET, | ||
+ FLV_CODECID_OPUS = 13<< FLV_AUDIO_CODECID_OFFSET, | ||
}; | ||
|
||
enum { | ||
@@ -110,6 +111,7 @@ | ||
FLV_CODECID_H264 = 7, | ||
FLV_CODECID_REALH263= 8, | ||
FLV_CODECID_MPEG4 = 9, | ||
+ FLV_CODECID_HEVC = 12, | ||
}; | ||
|
||
enum { | ||
diff -ruN ffmpeg-5.1.1/libavformat/flvdec.c ffmpeg-5.1.1-patch/libavformat/flvdec.c | ||
--- ffmpeg-5.1.1/libavformat/flvdec.c 2022-07-23 01:58:39.000000000 +0800 | ||
+++ ffmpeg-5.1.1-patch/libavformat/flvdec.c 2022-09-13 19:44:38.000000000 +0800 | ||
@@ -37,6 +37,7 @@ | ||
#include "demux.h" | ||
#include "internal.h" | ||
#include "flv.h" | ||
+#include "hevc.h" | ||
|
||
#define VALIDATE_INDEX_TS_THRESH 2500 | ||
|
||
@@ -236,6 +237,11 @@ | ||
case FLV_CODECID_PCM_ALAW: | ||
return apar->sample_rate == 8000 && | ||
apar->codec_id == AV_CODEC_ID_PCM_ALAW; | ||
+ case FLV_CODECID_OPUS: | ||
+ return apar->sample_rate == 48000 && | ||
+ apar->channels == 2 && | ||
+ apar->bits_per_coded_sample == 16 && | ||
+ apar->codec_id == AV_CODEC_ID_OPUS; | ||
default: | ||
return apar->codec_tag == (flv_codecid >> FLV_AUDIO_CODECID_OFFSET); | ||
} | ||
@@ -294,6 +300,12 @@ | ||
apar->sample_rate = 8000; | ||
apar->codec_id = AV_CODEC_ID_PCM_ALAW; | ||
break; | ||
+ case FLV_CODECID_OPUS: | ||
+ apar->sample_rate = 48000; | ||
+ apar->channels = 2; | ||
+ apar->bits_per_coded_sample = 16; | ||
+ apar->codec_id = AV_CODEC_ID_OPUS; | ||
+ break; | ||
default: | ||
avpriv_request_sample(s, "Audio codec (%x)", | ||
flv_codecid >> FLV_AUDIO_CODECID_OFFSET); | ||
@@ -321,6 +333,8 @@ | ||
return vpar->codec_id == AV_CODEC_ID_VP6A; | ||
case FLV_CODECID_H264: | ||
return vpar->codec_id == AV_CODEC_ID_H264; | ||
+ case FLV_CODECID_HEVC: | ||
+ return vpar->codec_id == AV_CODEC_ID_HEVC; | ||
default: | ||
return vpar->codec_tag == flv_codecid; | ||
} | ||
@@ -371,6 +385,11 @@ | ||
par->codec_id = AV_CODEC_ID_MPEG4; | ||
ret = 3; | ||
break; | ||
+ case FLV_CODECID_HEVC: | ||
+ par->codec_id = AV_CODEC_ID_HEVC; | ||
+ vstreami->need_parsing = AVSTREAM_PARSE_NONE; | ||
+ ret = 3; // not 4, reading packet type will consume one byte | ||
+ break; | ||
default: | ||
avpriv_request_sample(s, "Video codec (%x)", flv_codecid); | ||
par->codec_tag = flv_codecid; | ||
@@ -1240,7 +1259,8 @@ | ||
|
||
if (st->codecpar->codec_id == AV_CODEC_ID_AAC || | ||
st->codecpar->codec_id == AV_CODEC_ID_H264 || | ||
- st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { | ||
+ st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || | ||
+ st->codecpar->codec_id == AV_CODEC_ID_HEVC ) { | ||
int type = avio_r8(s->pb); | ||
size--; | ||
|
||
@@ -1249,7 +1269,7 @@ | ||
goto leave; | ||
} | ||
|
||
- if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { | ||
+ if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || st->codecpar->codec_id == AV_CODEC_ID_HEVC) { | ||
// sign extension | ||
int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; | ||
pts = av_sat_add64(dts, cts); | ||
@@ -1265,7 +1285,8 @@ | ||
} | ||
} | ||
if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC || | ||
- st->codecpar->codec_id == AV_CODEC_ID_H264)) { | ||
+ st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC)) { | ||
+ | ||
AVDictionaryEntry *t; | ||
|
||
if (st->codecpar->extradata) { | ||
diff -ruN ffmpeg-5.1.1/libavformat/flvenc.c ffmpeg-5.1.1-patch/libavformat/flvenc.c | ||
--- ffmpeg-5.1.1/libavformat/flvenc.c 2022-07-23 01:58:39.000000000 +0800 | ||
+++ ffmpeg-5.1.1-patch/libavformat/flvenc.c 2022-09-13 20:07:09.000000000 +0800 | ||
@@ -27,6 +27,7 @@ | ||
#include "libavcodec/mpeg4audio.h" | ||
#include "avio.h" | ||
#include "avc.h" | ||
+#include "hevc.h" | ||
#include "avformat.h" | ||
#include "flv.h" | ||
#include "internal.h" | ||
@@ -34,7 +35,6 @@ | ||
#include "libavutil/opt.h" | ||
#include "libavcodec/put_bits.h" | ||
|
||
- | ||
static const AVCodecTag flv_video_codec_ids[] = { | ||
{ AV_CODEC_ID_FLV1, FLV_CODECID_H263 }, | ||
{ AV_CODEC_ID_H263, FLV_CODECID_REALH263 }, | ||
@@ -45,6 +45,7 @@ | ||
{ AV_CODEC_ID_VP6, FLV_CODECID_VP6 }, | ||
{ AV_CODEC_ID_VP6A, FLV_CODECID_VP6A }, | ||
{ AV_CODEC_ID_H264, FLV_CODECID_H264 }, | ||
+ { AV_CODEC_ID_HEVC, FLV_CODECID_HEVC }, | ||
{ AV_CODEC_ID_NONE, 0 } | ||
}; | ||
|
||
@@ -59,6 +60,7 @@ | ||
{ AV_CODEC_ID_PCM_MULAW, FLV_CODECID_PCM_MULAW >> FLV_AUDIO_CODECID_OFFSET }, | ||
{ AV_CODEC_ID_PCM_ALAW, FLV_CODECID_PCM_ALAW >> FLV_AUDIO_CODECID_OFFSET }, | ||
{ AV_CODEC_ID_SPEEX, FLV_CODECID_SPEEX >> FLV_AUDIO_CODECID_OFFSET }, | ||
+ { AV_CODEC_ID_OPUS, FLV_CODECID_OPUS >> FLV_AUDIO_CODECID_OFFSET }, | ||
{ AV_CODEC_ID_NONE, 0 } | ||
}; | ||
|
||
@@ -131,6 +133,9 @@ | ||
if (par->codec_id == AV_CODEC_ID_AAC) // specs force these parameters | ||
return FLV_CODECID_AAC | FLV_SAMPLERATE_44100HZ | | ||
FLV_SAMPLESSIZE_16BIT | FLV_STEREO; | ||
+ else if (par->codec_id == AV_CODEC_ID_OPUS) // specs force these parameters | ||
+ return FLV_CODECID_OPUS | FLV_SAMPLERATE_44100HZ | | ||
+ FLV_SAMPLESSIZE_16BIT | FLV_STEREO; | ||
else if (par->codec_id == AV_CODEC_ID_SPEEX) { | ||
if (par->sample_rate != 16000) { | ||
av_log(s, AV_LOG_ERROR, | ||
@@ -490,7 +495,7 @@ | ||
FLVContext *flv = s->priv_data; | ||
|
||
if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 | ||
- || par->codec_id == AV_CODEC_ID_MPEG4) { | ||
+ || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { | ||
int64_t pos; | ||
avio_w8(pb, | ||
par->codec_type == AVMEDIA_TYPE_VIDEO ? | ||
@@ -536,7 +541,11 @@ | ||
avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags | ||
avio_w8(pb, 0); // AVC sequence header | ||
avio_wb24(pb, 0); // composition time | ||
- ff_isom_write_avcc(pb, par->extradata, par->extradata_size); | ||
+ if (par->codec_id == AV_CODEC_ID_HEVC) { | ||
+ ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); | ||
+ } else { | ||
+ ff_isom_write_avcc(pb, par->extradata, par->extradata_size); | ||
+ } | ||
} | ||
data_size = avio_tell(pb) - pos; | ||
avio_seek(pb, -data_size - 10, SEEK_CUR); | ||
@@ -783,7 +792,7 @@ | ||
AVCodecParameters *par = s->streams[i]->codecpar; | ||
FLVStreamContext *sc = s->streams[i]->priv_data; | ||
if (par->codec_type == AVMEDIA_TYPE_VIDEO && | ||
- (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4)) | ||
+ (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC)) | ||
put_avc_eos_tag(pb, sc->last_ts); | ||
} | ||
} | ||
@@ -834,13 +843,13 @@ | ||
if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A || | ||
par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) | ||
flags_size = 2; | ||
- else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) | ||
+ else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) | ||
flags_size = 5; | ||
else | ||
flags_size = 1; | ||
|
||
if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 | ||
- || par->codec_id == AV_CODEC_ID_MPEG4) { | ||
+ || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { | ||
size_t side_size; | ||
uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); | ||
if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { | ||
@@ -905,7 +914,11 @@ | ||
if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) | ||
if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0) | ||
return ret; | ||
- } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && | ||
+ } else if (par->codec_id == AV_CODEC_ID_HEVC) { | ||
+ if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) | ||
+ if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0) | ||
+ return ret; | ||
+ } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && | ||
(AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { | ||
if (!s->streams[pkt->stream_index]->nb_frames) { | ||
av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: " | ||
@@ -977,7 +990,7 @@ | ||
(FFALIGN(par->height, 16) - par->height)); | ||
} else if (par->codec_id == AV_CODEC_ID_AAC) | ||
avio_w8(pb, 1); // AAC raw | ||
- else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) { | ||
+ else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { | ||
avio_w8(pb, 1); // AVC NALU | ||
avio_wb24(pb, pkt->pts - pkt->dts); | ||
} |