diff mbox series

[FFmpeg-devel,v8,1/6] avformat/flvenc: Add support for HEVC over flv in muxer

Message ID 20230413094441.56225-2-lq@chinaffmpeg.org
State New
Headers show
Series Suppor hevc av1 and vp9 codec in enhanced flv | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Liu Steven April 13, 2023, 9:44 a.m. UTC
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
---
 libavformat/flv.h    | 15 +++++++++++++++
 libavformat/flvenc.c | 41 +++++++++++++++++++++++++++++++----------
 2 files changed, 46 insertions(+), 10 deletions(-)

Comments

Andreas Rheinhardt May 11, 2023, 5:58 p.m. UTC | #1
Steven Liu:
> Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
> ---
>  libavformat/flv.h    | 15 +++++++++++++++
>  libavformat/flvenc.c | 41 +++++++++++++++++++++++++++++++----------
>  2 files changed, 46 insertions(+), 10 deletions(-)
> 
> diff --git a/libavformat/flv.h b/libavformat/flv.h
> index 3571b90279..91e0a4140c 100644
> --- a/libavformat/flv.h
> +++ b/libavformat/flv.h
> @@ -35,6 +35,12 @@
>  
>  #define FLV_VIDEO_FRAMETYPE_OFFSET   4
>  
> +/* Extended VideoTagHeader
> + * defined in reference link:
> + * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> + * */
> +#define FLV_IS_EX_HEADER          0x80
> +
>  /* bitmasks to isolate specific values */
>  #define FLV_AUDIO_CHANNEL_MASK    0x01
>  #define FLV_AUDIO_SAMPLESIZE_MASK 0x02
> @@ -112,6 +118,15 @@ enum {
>      FLV_CODECID_MPEG4   = 9,
>  };
>  
> +enum {
> +    PacketTypeSequenceStart         = 0,
> +    PacketTypeCodedFrames           = 1,
> +    PacketTypeSequenceEnd           = 2,
> +    PacketTypeCodedFramesX          = 3,
> +    PacketTypeMetadata              = 4,
> +    PacketTypeMPEG2TSSequenceStart  = 5,
> +};
> +
>  enum {
>      FLV_FRAME_KEY            = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame)
>      FLV_FRAME_INTER          = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame)
> diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
> index fbf7eabaf8..57a26245ff 100644
> --- a/libavformat/flvenc.c
> +++ b/libavformat/flvenc.c
> @@ -28,6 +28,7 @@
>  #include "libavcodec/mpeg4audio.h"
>  #include "avio.h"
>  #include "avc.h"
> +#include "hevc.h"
>  #include "avformat.h"
>  #include "flv.h"
>  #include "internal.h"
> @@ -46,6 +47,7 @@ static const AVCodecTag flv_video_codec_ids[] = {
>      { 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,     MKBETAG('h', 'v', 'c', '1') },
>      { AV_CODEC_ID_NONE,     0 }
>  };
>  
> @@ -492,7 +494,7 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
>      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 ?
> @@ -535,10 +537,19 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
>              }
>              avio_write(pb, par->extradata, par->extradata_size);
>          } else {
> -            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) {
> +                avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart); // ExVideoTagHeader mode with PacketTypeSequenceStart
> +                avio_write(pb, "hvc1", 4);
> +            } else {
> +                avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags
> +                avio_w8(pb, 0); // AVC sequence header
> +                avio_wb24(pb, 0); // composition time
> +            }
> +
> +            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);
> @@ -628,7 +639,8 @@ static int flv_init(struct AVFormatContext *s)
>                  return unsupported_codec(s, "Video", par->codec_id);
>  
>              if (par->codec_id == AV_CODEC_ID_MPEG4 ||
> -                par->codec_id == AV_CODEC_ID_H263) {
> +                par->codec_id == AV_CODEC_ID_H263 ||
> +                par->codec_id == AV_CODEC_ID_HEVC) {
>                  int error = s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL;
>                  av_log(s, error ? AV_LOG_ERROR : AV_LOG_WARNING,
>                         "Codec %s is not supported in the official FLV specification,\n", avcodec_get_name(par->codec_id));
> @@ -836,13 +848,13 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
>      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))) {
> @@ -862,7 +874,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
>                 "Packets are not in the proper order with respect to DTS\n");
>          return AVERROR(EINVAL);
>      }
> -    if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) {
> +    if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
>          if (pkt->pts == AV_NOPTS_VALUE) {
>              av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n");
>              return AVERROR(EINVAL);
> @@ -907,6 +919,10 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
>          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_HEVC) {
> +        if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1)
> +            if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0)

This requires a flvenc->hevc.o Makefile dependency. Similarly for other
patches in this patchset.

> +                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) {
> @@ -968,7 +984,12 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
>          avio_wb32(pb, data_size + 11);
>      } else {
>          av_assert1(flags>=0);
> -        avio_w8(pb,flags);
> +        if (par->codec_id == AV_CODEC_ID_HEVC) {
> +            avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX); // ExVideoTagHeader mode with PacketTypeCodedFramesX
> +            avio_write(pb, "hvc1", 4);
> +        } else {
> +            avio_w8(pb, flags);
> +        }
>          if (par->codec_id == AV_CODEC_ID_VP6)
>              avio_w8(pb,0);
>          if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) {
Timo Rothenpieler May 12, 2023, 10:31 a.m. UTC | #2
On 12/05/2023 05:58, Steven Liu wrote:
> Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> The enhanced flv documentation contributors include
> Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> So this should be support by ffmpeg too.
> 
> v8:
>      Support vp9 codec according to enhanced flv.
>      Support PacketTypeCodedFrames type for hevc in flv.
> v9:
>      Add dependency codec object files for flvenc in Makefile.
>      Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> 
> Steven Liu (6):
>    avformat/flvenc: Add support for HEVC over flv in muxer

This is very much a nit, but one of those commit messages is not like 
the others :D

>    avformat/flvdec: support demux hevc in enhanced flv
>    avformat/flvenc: support mux av1 in enhanced flv
>    avformat/flvdec: support demux av1 in enhanced flv
>    avformat/flvenc: support mux vp9 in enhanced flv
>    avformat/flvenc: support demux vp9 in enhanced flv
> 
>   libavformat/Makefile |  2 +-
>   libavformat/flv.h    | 15 +++++++++
>   libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
>   libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
>   4 files changed, 130 insertions(+), 18 deletions(-)
>
Steven Liu May 12, 2023, 10:47 a.m. UTC | #3
Timo Rothenpieler <timo@rothenpieler.org> 于2023年5月12日周五 18:30写道:
Hi Timo,
>
> On 12/05/2023 05:58, Steven Liu wrote:
> > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > The enhanced flv documentation contributors include
> > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > So this should be support by ffmpeg too.
> >
> > v8:
> >      Support vp9 codec according to enhanced flv.
> >      Support PacketTypeCodedFrames type for hevc in flv.
> > v9:
> >      Add dependency codec object files for flvenc in Makefile.
> >      Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> >
> > Steven Liu (6):
> >    avformat/flvenc: Add support for HEVC over flv in muxer
>
> This is very much a nit, but one of those commit messages is not like
> the others :D
Should i resubmit one patch named v10? Or should i modify it like the
others before push? :D
>
> >    avformat/flvdec: support demux hevc in enhanced flv
> >    avformat/flvenc: support mux av1 in enhanced flv
> >    avformat/flvdec: support demux av1 in enhanced flv
> >    avformat/flvenc: support mux vp9 in enhanced flv
> >    avformat/flvenc: support demux vp9 in enhanced flv
> >
> >   libavformat/Makefile |  2 +-
> >   libavformat/flv.h    | 15 +++++++++
> >   libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> >   libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> >   4 files changed, 130 insertions(+), 18 deletions(-)
> >

Thanks
Steven
Vibhoothi May 12, 2023, 10:47 a.m. UTC | #4
Hi,

On Fri, 12 May 2023 at 04:59, Steven Liu <lq@chinaffmpeg.org> wrote:
>
> Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> The enhanced flv documentation contributors include
> Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> So this should be support by ffmpeg too.
>
> v8:
>     Support vp9 codec according to enhanced flv.
>     Support PacketTypeCodedFrames type for hevc in flv.
> v9:
>     Add dependency codec object files for flvenc in Makefile.
>     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
>
> Steven Liu (6):
>   avformat/flvenc: Add support for HEVC over flv in muxer
>   avformat/flvdec: support demux hevc in enhanced flv
>   avformat/flvenc: support mux av1 in enhanced flv
>   avformat/flvdec: support demux av1 in enhanced flv
>   avformat/flvenc: support mux vp9 in enhanced flv
>   avformat/flvenc: support demux vp9 in enhanced flv
Nit: Shouldn't the commit message be pointing flvdec
("avformat/flvdec") instead of flvenc ("avformat/flvenc") for
VP9 demuxer support?

I could see the changes being made to,
 libavformat/flvdec.c | 11 +++++++++--,
in the patch set.

>
>  libavformat/Makefile |  2 +-
>  libavformat/flv.h    | 15 +++++++++
>  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
>  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
>  4 files changed, 130 insertions(+), 18 deletions(-)
>
> --
> 2.40.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".


Best,
V
Timo Rothenpieler May 12, 2023, 11:06 a.m. UTC | #5
On 12/05/2023 12:47, Steven Liu wrote:
> Timo Rothenpieler <timo@rothenpieler.org> 于2023年5月12日周五 18:30写道:
> Hi Timo,
>>
>> On 12/05/2023 05:58, Steven Liu wrote:
>>> Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
>>> The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
>>> you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
>>> The enhanced flv documentation contributors include
>>> Jean-Baptiste Kempf (FFmpeg, VideoLAN).
>>> So this should be support by ffmpeg too.
>>>
>>> v8:
>>>       Support vp9 codec according to enhanced flv.
>>>       Support PacketTypeCodedFrames type for hevc in flv.
>>> v9:
>>>       Add dependency codec object files for flvenc in Makefile.
>>>       Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
>>>
>>> Steven Liu (6):
>>>     avformat/flvenc: Add support for HEVC over flv in muxer
>>
>> This is very much a nit, but one of those commit messages is not like
>> the others :D
> Should i resubmit one patch named v10? Or should i modify it like the
> others before push? :D

Resubmitting the series for it seems silly.
Just format it like the other ones locally :D
Steven Liu May 12, 2023, 11:59 a.m. UTC | #6
Vibhoothi <vibhoothiiaanand@gmail.com> 于2023年5月12日周五 18:48写道:
>
> Hi,
>
> On Fri, 12 May 2023 at 04:59, Steven Liu <lq@chinaffmpeg.org> wrote:
> >
> > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > The enhanced flv documentation contributors include
> > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > So this should be support by ffmpeg too.
> >
> > v8:
> >     Support vp9 codec according to enhanced flv.
> >     Support PacketTypeCodedFrames type for hevc in flv.
> > v9:
> >     Add dependency codec object files for flvenc in Makefile.
> >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> >
> > Steven Liu (6):
> >   avformat/flvenc: Add support for HEVC over flv in muxer
> >   avformat/flvdec: support demux hevc in enhanced flv
> >   avformat/flvenc: support mux av1 in enhanced flv
> >   avformat/flvdec: support demux av1 in enhanced flv
> >   avformat/flvenc: support mux vp9 in enhanced flv
> >   avformat/flvenc: support demux vp9 in enhanced flv
> Nit: Shouldn't the commit message be pointing flvdec
> ("avformat/flvdec") instead of flvenc ("avformat/flvenc") for
> VP9 demuxer support?
Good catch,
Thanks Vibhoothi

 fix it localy.
>
> I could see the changes being made to,
>  libavformat/flvdec.c | 11 +++++++++--,
> in the patch set.
>
> >
> >  libavformat/Makefile |  2 +-
> >  libavformat/flv.h    | 15 +++++++++
> >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> >  4 files changed, 130 insertions(+), 18 deletions(-)
> >
> > --
> > 2.40.0
> >


Thanks
Steven
Neal Gompa May 13, 2023, 2:40 a.m. UTC | #7
On Fri, May 12, 2023 at 7:59 AM Steven Liu <lingjiujianke@gmail.com> wrote:
>
> Vibhoothi <vibhoothiiaanand@gmail.com> 于2023年5月12日周五 18:48写道:
> >
> > Hi,
> >
> > On Fri, 12 May 2023 at 04:59, Steven Liu <lq@chinaffmpeg.org> wrote:
> > >
> > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > > The enhanced flv documentation contributors include
> > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > > So this should be support by ffmpeg too.
> > >
> > > v8:
> > >     Support vp9 codec according to enhanced flv.
> > >     Support PacketTypeCodedFrames type for hevc in flv.
> > > v9:
> > >     Add dependency codec object files for flvenc in Makefile.
> > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> > >
> > > Steven Liu (6):
> > >   avformat/flvenc: Add support for HEVC over flv in muxer
> > >   avformat/flvdec: support demux hevc in enhanced flv
> > >   avformat/flvenc: support mux av1 in enhanced flv
> > >   avformat/flvdec: support demux av1 in enhanced flv
> > >   avformat/flvenc: support mux vp9 in enhanced flv
> > >   avformat/flvenc: support demux vp9 in enhanced flv
> > Nit: Shouldn't the commit message be pointing flvdec
> > ("avformat/flvdec") instead of flvenc ("avformat/flvenc") for
> > VP9 demuxer support?
> Good catch,
> Thanks Vibhoothi
>
>  fix it localy.
> >
> > I could see the changes being made to,
> >  libavformat/flvdec.c | 11 +++++++++--,
> > in the patch set.
> >
> > >
> > >  libavformat/Makefile |  2 +-
> > >  libavformat/flv.h    | 15 +++++++++
> > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> > >  4 files changed, 130 insertions(+), 18 deletions(-)
> > >
> > > --
> > > 2.40.0
> > >
>

I've applied your patch set to Fedora's ffmpeg 6.0 on Fedora 38 and
attempted to test it. It seems to mostly work now, except that AAC
audio doesn't play in the AV1+AAC sample remuxed from MKV to FLV. My
H264+AAC sample seems to work properly though.

Here are reproducer samples:
https://ngompa.fedorapeople.org/obs-recording-samples.tar

My command for remuxing them is simple:

$ ffmpeg -i "input.mkv" -vcodec copy -acodec copy "output.flv"
Steven Liu May 15, 2023, 8:37 a.m. UTC | #8
Neal Gompa <ngompa13@gmail.com> 于2023年5月13日周六 10:41写道:
Hi Neal,

>
>
> I've applied your patch set to Fedora's ffmpeg 6.0 on Fedora 38 and
> attempted to test it. It seems to mostly work now, except that AAC
> audio doesn't play in the AV1+AAC sample remuxed from MKV to FLV. My
> H264+AAC sample seems to work properly though.
>
> Here are reproducer samples:
> https://ngompa.fedorapeople.org/obs-recording-samples.tar
>
> My command for remuxing them is simple:
>
> $ ffmpeg -i "input.mkv" -vcodec copy -acodec copy "output.flv"

    Thanks for your test, that because the exheader flag is used in
audio stream too,
    It should used in video stream and exheader mode.



Thanks
Steven
Neal Gompa May 15, 2023, 8:41 p.m. UTC | #9
On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
>
> Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> The enhanced flv documentation contributors include
> Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> So this should be support by ffmpeg too.
>
> v8:
>     Support vp9 codec according to enhanced flv.
>     Support PacketTypeCodedFrames type for hevc in flv.
> v9:
>     Add dependency codec object files for flvenc in Makefile.
>     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
>
> v10:
>     modify first patch comment like the others before commit.
>     exheader mode should only happened in video stream this patchset.
>
> Steven Liu (6):
>   avformat/flvenc: support mux hevc in enhanced flv
>   avformat/flvdec: support demux hevc in enhanced flv
>   avformat/flvenc: support mux av1 in enhanced flv
>   avformat/flvdec: support demux av1 in enhanced flv
>   avformat/flvenc: support mux vp9 in enhanced flv
>   avformat/flvdec: support demux vp9 in enhanced flv
>
>  libavformat/Makefile |  2 +-
>  libavformat/flv.h    | 15 +++++++++
>  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
>  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
>  4 files changed, 130 insertions(+), 18 deletions(-)
>

This version works for me. Thanks for this work!

Tested-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Neal Gompa May 31, 2023, 5:47 a.m. UTC | #10
On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
>
> On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
> >
> > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > The enhanced flv documentation contributors include
> > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > So this should be support by ffmpeg too.
> >
> > v8:
> >     Support vp9 codec according to enhanced flv.
> >     Support PacketTypeCodedFrames type for hevc in flv.
> > v9:
> >     Add dependency codec object files for flvenc in Makefile.
> >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> >
> > v10:
> >     modify first patch comment like the others before commit.
> >     exheader mode should only happened in video stream this patchset.
> >
> > Steven Liu (6):
> >   avformat/flvenc: support mux hevc in enhanced flv
> >   avformat/flvdec: support demux hevc in enhanced flv
> >   avformat/flvenc: support mux av1 in enhanced flv
> >   avformat/flvdec: support demux av1 in enhanced flv
> >   avformat/flvenc: support mux vp9 in enhanced flv
> >   avformat/flvdec: support demux vp9 in enhanced flv
> >
> >  libavformat/Makefile |  2 +-
> >  libavformat/flv.h    | 15 +++++++++
> >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> >  4 files changed, 130 insertions(+), 18 deletions(-)
> >
>
> This version works for me. Thanks for this work!
>
> Tested-by: Neal Gompa <ngompa13@gmail.com>
> Reviewed-by: Neal Gompa <ngompa13@gmail.com>
>

Is this patch set going to get pushed to master anytime soon?
Steven Liu June 1, 2023, 12:02 a.m. UTC | #11
Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
>
> On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
> >
> > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
> > >
> > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > > The enhanced flv documentation contributors include
> > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > > So this should be support by ffmpeg too.
> > >
> > > v8:
> > >     Support vp9 codec according to enhanced flv.
> > >     Support PacketTypeCodedFrames type for hevc in flv.
> > > v9:
> > >     Add dependency codec object files for flvenc in Makefile.
> > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> > >
> > > v10:
> > >     modify first patch comment like the others before commit.
> > >     exheader mode should only happened in video stream this patchset.
> > >
> > > Steven Liu (6):
> > >   avformat/flvenc: support mux hevc in enhanced flv
> > >   avformat/flvdec: support demux hevc in enhanced flv
> > >   avformat/flvenc: support mux av1 in enhanced flv
> > >   avformat/flvdec: support demux av1 in enhanced flv
> > >   avformat/flvenc: support mux vp9 in enhanced flv
> > >   avformat/flvdec: support demux vp9 in enhanced flv
> > >
> > >  libavformat/Makefile |  2 +-
> > >  libavformat/flv.h    | 15 +++++++++
> > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> > >  4 files changed, 130 insertions(+), 18 deletions(-)
> > >
> >
> > This version works for me. Thanks for this work!
> >
> > Tested-by: Neal Gompa <ngompa13@gmail.com>
> > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
> >
>
> Is this patch set going to get pushed to master anytime soon?

Hi Neal,

Waiting for j-b check about the Enhanced-FLV status, i cannot sure if
this patch can be pushed now.




Thanks
Steven
Tristan Matthews June 1, 2023, 5:03 a.m. UTC | #12
> you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.

Were you able to push av1 or vp9 to Youtube with this patchset alone?

Best,
-t

On Wed, May 31, 2023 at 8:03 PM Steven Liu <lingjiujianke@gmail.com> wrote:
>
> Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
> >
> > On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
> > >
> > > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
> > > >
> > > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > > > The enhanced flv documentation contributors include
> > > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > > > So this should be support by ffmpeg too.
> > > >
> > > > v8:
> > > >     Support vp9 codec according to enhanced flv.
> > > >     Support PacketTypeCodedFrames type for hevc in flv.
> > > > v9:
> > > >     Add dependency codec object files for flvenc in Makefile.
> > > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> > > >
> > > > v10:
> > > >     modify first patch comment like the others before commit.
> > > >     exheader mode should only happened in video stream this patchset.
> > > >
> > > > Steven Liu (6):
> > > >   avformat/flvenc: support mux hevc in enhanced flv
> > > >   avformat/flvdec: support demux hevc in enhanced flv
> > > >   avformat/flvenc: support mux av1 in enhanced flv
> > > >   avformat/flvdec: support demux av1 in enhanced flv
> > > >   avformat/flvenc: support mux vp9 in enhanced flv
> > > >   avformat/flvdec: support demux vp9 in enhanced flv
> > > >
> > > >  libavformat/Makefile |  2 +-
> > > >  libavformat/flv.h    | 15 +++++++++
> > > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> > > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> > > >  4 files changed, 130 insertions(+), 18 deletions(-)
> > > >
> > >
> > > This version works for me. Thanks for this work!
> > >
> > > Tested-by: Neal Gompa <ngompa13@gmail.com>
> > > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
> > >
> >
> > Is this patch set going to get pushed to master anytime soon?
>
> Hi Neal,
>
> Waiting for j-b check about the Enhanced-FLV status, i cannot sure if
> this patch can be pushed now.
>
>
>
>
> Thanks
> Steven
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Steven Liu June 1, 2023, 6:07 a.m. UTC | #13
Tristan Matthews <tmatth@videolan.org> 于2023年6月1日周四 13:03写道:
>
> > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
>
> Were you able to push av1 or vp9 to Youtube with this patchset alone?
I've tested push them after after this patchset, do you mean you get
some problems after this patchset?


Thanks
Steven
Jean-Baptiste Kempf June 1, 2023, 9:29 a.m. UTC | #14
Hello,

On Thu, 1 Jun 2023, at 02:02, Steven Liu wrote:
> Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
>>
>> On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
>> >
>> > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
>> > >
>> > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
>> > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
>> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
>> > > The enhanced flv documentation contributors include
>> > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
>> > > So this should be support by ffmpeg too.
>> > >
>> > > v8:
>> > >     Support vp9 codec according to enhanced flv.
>> > >     Support PacketTypeCodedFrames type for hevc in flv.
>> > > v9:
>> > >     Add dependency codec object files for flvenc in Makefile.
>> > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
>> > >
>> > > v10:
>> > >     modify first patch comment like the others before commit.
>> > >     exheader mode should only happened in video stream this patchset.
>> > >
>> > > Steven Liu (6):
>> > >   avformat/flvenc: support mux hevc in enhanced flv
>> > >   avformat/flvdec: support demux hevc in enhanced flv
>> > >   avformat/flvenc: support mux av1 in enhanced flv
>> > >   avformat/flvdec: support demux av1 in enhanced flv
>> > >   avformat/flvenc: support mux vp9 in enhanced flv
>> > >   avformat/flvdec: support demux vp9 in enhanced flv
>> > >
>> > >  libavformat/Makefile |  2 +-
>> > >  libavformat/flv.h    | 15 +++++++++
>> > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
>> > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
>> > >  4 files changed, 130 insertions(+), 18 deletions(-)
>> > >
>> >
>> > This version works for me. Thanks for this work!
>> >
>> > Tested-by: Neal Gompa <ngompa13@gmail.com>
>> > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
>> >
>>
>> Is this patch set going to get pushed to master anytime soon?
>
> Hi Neal,
>
> Waiting for j-b check about the Enhanced-FLV status, i cannot sure if
> this patch can be pushed now.

I've just re-asked what is the final status of the spec.

If you cannot wait, use experimental flags.

jb
Tristan Matthews June 1, 2023, 5:57 p.m. UTC | #15
On Thu, Jun 1, 2023 at 2:08 AM Steven Liu <lingjiujianke@gmail.com> wrote:
>
> Tristan Matthews <tmatth@videolan.org> 于2023年6月1日周四 13:03写道:
> >
> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> >
> > Were you able to push av1 or vp9 to Youtube with this patchset alone?
> I've tested push them after after this patchset, do you mean you get
> some problems after this patchset?

Yeah for me at least vp9 and av1 are falling over when I try to push
to youtube over RTMP, I was under the impression that beyond patching
the FLV muxer you'd also need to add a `fourCcList` to the connect
command of the rtmp muxer (see "Extending NetConnection connect
command" of https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf).

In any case that's not really the scope of this patchset and I don't
want to derail the discussion, muxing to an flv file works fine. I
just wanted to clarify what was possible with these changes and I'm
surprised that you were able to push to youtube live with this given
the above, as I am not.

Best,
-t

>
>
> Thanks
> Steven
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Steven Liu June 2, 2023, 1:37 a.m. UTC | #16
Tristan Matthews <tmatth@videolan.org> 于2023年6月2日周五 01:58写道:
>
> On Thu, Jun 1, 2023 at 2:08 AM Steven Liu <lingjiujianke@gmail.com> wrote:
> >
> > Tristan Matthews <tmatth@videolan.org> 于2023年6月1日周四 13:03写道:
> > >
> > > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > >
> > > Were you able to push av1 or vp9 to Youtube with this patchset alone?
> > I've tested push them after after this patchset, do you mean you get
> > some problems after this patchset?
>
> Yeah for me at least vp9 and av1 are falling over when I try to push
> to youtube over RTMP, I was under the impression that beyond patching
> the FLV muxer you'd also need to add a `fourCcList` to the connect
> command of the rtmp muxer (see "Extending NetConnection connect
> command" of https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf).
>
> In any case that's not really the scope of this patchset and I don't
> want to derail the discussion, muxing to an flv file works fine. I
> just wanted to clarify what was possible with these changes and I'm
> surprised that you were able to push to youtube live with this given
> the above, as I am not.
I tested publish the two codecs type, av1,vp9 to youtube, and i can
play by youtube player, but i saw the stream info always is vp9 in
flv.

Thanks
Steven
Steven Liu June 6, 2023, 6:42 a.m. UTC | #17
Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
>
> On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
> >
> > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
> > >
> > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > > The enhanced flv documentation contributors include
> > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > > So this should be support by ffmpeg too.
> > >
> > > v8:
> > >     Support vp9 codec according to enhanced flv.
> > >     Support PacketTypeCodedFrames type for hevc in flv.
> > > v9:
> > >     Add dependency codec object files for flvenc in Makefile.
> > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> > >
> > > v10:
> > >     modify first patch comment like the others before commit.
> > >     exheader mode should only happened in video stream this patchset.
> > >
> > > Steven Liu (6):
> > >   avformat/flvenc: support mux hevc in enhanced flv
> > >   avformat/flvdec: support demux hevc in enhanced flv
> > >   avformat/flvenc: support mux av1 in enhanced flv
> > >   avformat/flvdec: support demux av1 in enhanced flv
> > >   avformat/flvenc: support mux vp9 in enhanced flv
> > >   avformat/flvdec: support demux vp9 in enhanced flv
> > >
> > >  libavformat/Makefile |  2 +-
> > >  libavformat/flv.h    | 15 +++++++++
> > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> > >  4 files changed, 130 insertions(+), 18 deletions(-)
> > >
> >
> > This version works for me. Thanks for this work!
> >
> > Tested-by: Neal Gompa <ngompa13@gmail.com>
> > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
> >
>
> Is this patch set going to get pushed to master anytime soon?

Hi Neal,

    Do you agree move the enhanced flv support into experimental flags?



Thanks
Steven
Neal Gompa June 8, 2023, 12:02 a.m. UTC | #18
On Tue, Jun 6, 2023 at 2:43 AM Steven Liu <lingjiujianke@gmail.com> wrote:
>
> Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
> >
> > On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
> > >
> > > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
> > > >
> > > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > > > The enhanced flv documentation contributors include
> > > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > > > So this should be support by ffmpeg too.
> > > >
> > > > v8:
> > > >     Support vp9 codec according to enhanced flv.
> > > >     Support PacketTypeCodedFrames type for hevc in flv.
> > > > v9:
> > > >     Add dependency codec object files for flvenc in Makefile.
> > > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> > > >
> > > > v10:
> > > >     modify first patch comment like the others before commit.
> > > >     exheader mode should only happened in video stream this patchset.
> > > >
> > > > Steven Liu (6):
> > > >   avformat/flvenc: support mux hevc in enhanced flv
> > > >   avformat/flvdec: support demux hevc in enhanced flv
> > > >   avformat/flvenc: support mux av1 in enhanced flv
> > > >   avformat/flvdec: support demux av1 in enhanced flv
> > > >   avformat/flvenc: support mux vp9 in enhanced flv
> > > >   avformat/flvdec: support demux vp9 in enhanced flv
> > > >
> > > >  libavformat/Makefile |  2 +-
> > > >  libavformat/flv.h    | 15 +++++++++
> > > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> > > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> > > >  4 files changed, 130 insertions(+), 18 deletions(-)
> > > >
> > >
> > > This version works for me. Thanks for this work!
> > >
> > > Tested-by: Neal Gompa <ngompa13@gmail.com>
> > > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
> > >
> >
> > Is this patch set going to get pushed to master anytime soon?
>
> Hi Neal,
>
>     Do you agree move the enhanced flv support into experimental flags?
>

I don't think we should mark it experimental. Aside from the fact that
other implementations haven't done that, it's in production now with
YouTube.
Tristan Matthews June 9, 2023, 10:46 p.m. UTC | #19
On Wed, Jun 7, 2023 at 8:02 PM Neal Gompa <ngompa13@gmail.com> wrote:
>
> On Tue, Jun 6, 2023 at 2:43 AM Steven Liu <lingjiujianke@gmail.com> wrote:
> >
> > Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
> > >
> > > On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
> > > >
> > > > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
> > > > >
> > > > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> > > > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
> > > > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> > > > > The enhanced flv documentation contributors include
> > > > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> > > > > So this should be support by ffmpeg too.
> > > > >
> > > > > v8:
> > > > >     Support vp9 codec according to enhanced flv.
> > > > >     Support PacketTypeCodedFrames type for hevc in flv.
> > > > > v9:
> > > > >     Add dependency codec object files for flvenc in Makefile.
> > > > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> > > > >
> > > > > v10:
> > > > >     modify first patch comment like the others before commit.
> > > > >     exheader mode should only happened in video stream this patchset.
> > > > >
> > > > > Steven Liu (6):
> > > > >   avformat/flvenc: support mux hevc in enhanced flv
> > > > >   avformat/flvdec: support demux hevc in enhanced flv
> > > > >   avformat/flvenc: support mux av1 in enhanced flv
> > > > >   avformat/flvdec: support demux av1 in enhanced flv
> > > > >   avformat/flvenc: support mux vp9 in enhanced flv
> > > > >   avformat/flvdec: support demux vp9 in enhanced flv
> > > > >
> > > > >  libavformat/Makefile |  2 +-
> > > > >  libavformat/flv.h    | 15 +++++++++
> > > > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
> > > > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> > > > >  4 files changed, 130 insertions(+), 18 deletions(-)
> > > > >
> > > >
> > > > This version works for me. Thanks for this work!
> > > >
> > > > Tested-by: Neal Gompa <ngompa13@gmail.com>
> > > > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
> > > >
> > >
> > > Is this patch set going to get pushed to master anytime soon?
> >
> > Hi Neal,
> >
> >     Do you agree move the enhanced flv support into experimental flags?
> >
>
> I don't think we should mark it experimental. Aside from the fact that
> other implementations haven't done that, it's in production now with
> YouTube.
>

Just wanted to add that v11 also worked for me (successfully tested
pushing RTMP 720p and 1080p AV1 from a live source, tried VP9 but
YouTube doesn't seem to support it as ingest). I can also confirm what
Steven reported that YouTube will output VP9 or AVC given AV1 RTMP
(from the "Stats for nerds" menu).

Great work!

Tested-by: Tristan Matthews <tmatth@videolan.org>
Reviewed-by: Tristan Matthews <tmatth@videolan.org>
Jean-Baptiste Kempf July 17, 2023, 11:37 a.m. UTC | #20
Please merge.

On Thu, 1 Jun 2023, at 12:29, Jean-Baptiste Kempf wrote:
> Hello,
>
> On Thu, 1 Jun 2023, at 02:02, Steven Liu wrote:
>> Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
>>>
>>> On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com> wrote:
>>> >
>>> > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org> wrote:
>>> > >
>>> > > Reference file: https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
>>> > > The Enhanced flv has been supported by OBS, Simple Realtime Server, mpegts.js.
>>> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
>>> > > The enhanced flv documentation contributors include
>>> > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
>>> > > So this should be support by ffmpeg too.
>>> > >
>>> > > v8:
>>> > >     Support vp9 codec according to enhanced flv.
>>> > >     Support PacketTypeCodedFrames type for hevc in flv.
>>> > > v9:
>>> > >     Add dependency codec object files for flvenc in Makefile.
>>> > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
>>> > >
>>> > > v10:
>>> > >     modify first patch comment like the others before commit.
>>> > >     exheader mode should only happened in video stream this patchset.
>>> > >
>>> > > Steven Liu (6):
>>> > >   avformat/flvenc: support mux hevc in enhanced flv
>>> > >   avformat/flvdec: support demux hevc in enhanced flv
>>> > >   avformat/flvenc: support mux av1 in enhanced flv
>>> > >   avformat/flvdec: support demux av1 in enhanced flv
>>> > >   avformat/flvenc: support mux vp9 in enhanced flv
>>> > >   avformat/flvdec: support demux vp9 in enhanced flv
>>> > >
>>> > >  libavformat/Makefile |  2 +-
>>> > >  libavformat/flv.h    | 15 +++++++++
>>> > >  libavformat/flvdec.c | 73 +++++++++++++++++++++++++++++++++++++++-----
>>> > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
>>> > >  4 files changed, 130 insertions(+), 18 deletions(-)
>>> > >
>>> >
>>> > This version works for me. Thanks for this work!
>>> >
>>> > Tested-by: Neal Gompa <ngompa13@gmail.com>
>>> > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
>>> >
>>>
>>> Is this patch set going to get pushed to master anytime soon?
>>
>> Hi Neal,
>>
>> Waiting for j-b check about the Enhanced-FLV status, i cannot sure if
>> this patch can be pushed now.
>
> I've just re-asked what is the final status of the spec.
>
> If you cannot wait, use experimental flags.
>
> jb
> -- 
> Jean-Baptiste Kempf -  President
> +33 672 704 734
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Steven Liu July 17, 2023, 2:07 p.m. UTC | #21
Jean-Baptiste Kempf <jb@videolan.org>于2023年7月17日 周一19:37写道:

> Please merge.

will apply

>
>
> On Thu, 1 Jun 2023, at 12:29, Jean-Baptiste Kempf wrote:
> > Hello,
> >
> > On Thu, 1 Jun 2023, at 02:02, Steven Liu wrote:
> >> Neal Gompa <ngompa13@gmail.com> 于2023年5月31日周三 13:47写道:
> >>>
> >>> On Mon, May 15, 2023 at 10:41 PM Neal Gompa <ngompa13@gmail.com>
> wrote:
> >>> >
> >>> > On Mon, May 15, 2023 at 4:32 AM Steven Liu <lq@chinaffmpeg.org>
> wrote:
> >>> > >
> >>> > > Reference file:
> https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
> >>> > > The Enhanced flv has been supported by OBS, Simple Realtime
> Server, mpegts.js.
> >>> > > you can publish hevc, av1 or vp9 codec stream to Youtube over rtmp.
> >>> > > The enhanced flv documentation contributors include
> >>> > > Jean-Baptiste Kempf (FFmpeg, VideoLAN).
> >>> > > So this should be support by ffmpeg too.
> >>> > >
> >>> > > v8:
> >>> > >     Support vp9 codec according to enhanced flv.
> >>> > >     Support PacketTypeCodedFrames type for hevc in flv.
> >>> > > v9:
> >>> > >     Add dependency codec object files for flvenc in Makefile.
> >>> > >     Move the hevc,av1,vp9 codec out of FF_COMPLIANCE_UNOFFICIAL.
> >>> > >
> >>> > > v10:
> >>> > >     modify first patch comment like the others before commit.
> >>> > >     exheader mode should only happened in video stream this
> patchset.
> >>> > >
> >>> > > Steven Liu (6):
> >>> > >   avformat/flvenc: support mux hevc in enhanced flv
> >>> > >   avformat/flvdec: support demux hevc in enhanced flv
> >>> > >   avformat/flvenc: support mux av1 in enhanced flv
> >>> > >   avformat/flvdec: support demux av1 in enhanced flv
> >>> > >   avformat/flvenc: support mux vp9 in enhanced flv
> >>> > >   avformat/flvdec: support demux vp9 in enhanced flv
> >>> > >
> >>> > >  libavformat/Makefile |  2 +-
> >>> > >  libavformat/flv.h    | 15 +++++++++
> >>> > >  libavformat/flvdec.c | 73
> +++++++++++++++++++++++++++++++++++++++-----
> >>> > >  libavformat/flvenc.c | 58 +++++++++++++++++++++++++++++------
> >>> > >  4 files changed, 130 insertions(+), 18 deletions(-)
> >>> > >
> >>> >
> >>> > This version works for me. Thanks for this work!
> >>> >
> >>> > Tested-by: Neal Gompa <ngompa13@gmail.com>
> >>> > Reviewed-by: Neal Gompa <ngompa13@gmail.com>
> >>> >
> >>>
> >>> Is this patch set going to get pushed to master anytime soon?
> >>
> >> Hi Neal,
> >>
> >> Waiting for j-b check about the Enhanced-FLV status, i cannot sure if
> >> this patch can be pushed now.
> >
> > I've just re-asked what is the final status of the spec.
> >
> > If you cannot wait, use experimental flags.
> >
> > jb
> > --
> > Jean-Baptiste Kempf -  President
> > +33 672 704 734
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
> --
> Jean-Baptiste Kempf -  President
> +33 672 704 734
>
diff mbox series

Patch

diff --git a/libavformat/flv.h b/libavformat/flv.h
index 3571b90279..91e0a4140c 100644
--- a/libavformat/flv.h
+++ b/libavformat/flv.h
@@ -35,6 +35,12 @@ 
 
 #define FLV_VIDEO_FRAMETYPE_OFFSET   4
 
+/* Extended VideoTagHeader
+ * defined in reference link:
+ * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
+ * */
+#define FLV_IS_EX_HEADER          0x80
+
 /* bitmasks to isolate specific values */
 #define FLV_AUDIO_CHANNEL_MASK    0x01
 #define FLV_AUDIO_SAMPLESIZE_MASK 0x02
@@ -112,6 +118,15 @@  enum {
     FLV_CODECID_MPEG4   = 9,
 };
 
+enum {
+    PacketTypeSequenceStart         = 0,
+    PacketTypeCodedFrames           = 1,
+    PacketTypeSequenceEnd           = 2,
+    PacketTypeCodedFramesX          = 3,
+    PacketTypeMetadata              = 4,
+    PacketTypeMPEG2TSSequenceStart  = 5,
+};
+
 enum {
     FLV_FRAME_KEY            = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame)
     FLV_FRAME_INTER          = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame)
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
index fbf7eabaf8..57a26245ff 100644
--- a/libavformat/flvenc.c
+++ b/libavformat/flvenc.c
@@ -28,6 +28,7 @@ 
 #include "libavcodec/mpeg4audio.h"
 #include "avio.h"
 #include "avc.h"
+#include "hevc.h"
 #include "avformat.h"
 #include "flv.h"
 #include "internal.h"
@@ -46,6 +47,7 @@  static const AVCodecTag flv_video_codec_ids[] = {
     { 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,     MKBETAG('h', 'v', 'c', '1') },
     { AV_CODEC_ID_NONE,     0 }
 };
 
@@ -492,7 +494,7 @@  static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
     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 ?
@@ -535,10 +537,19 @@  static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i
             }
             avio_write(pb, par->extradata, par->extradata_size);
         } else {
-            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) {
+                avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart); // ExVideoTagHeader mode with PacketTypeSequenceStart
+                avio_write(pb, "hvc1", 4);
+            } else {
+                avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags
+                avio_w8(pb, 0); // AVC sequence header
+                avio_wb24(pb, 0); // composition time
+            }
+
+            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);
@@ -628,7 +639,8 @@  static int flv_init(struct AVFormatContext *s)
                 return unsupported_codec(s, "Video", par->codec_id);
 
             if (par->codec_id == AV_CODEC_ID_MPEG4 ||
-                par->codec_id == AV_CODEC_ID_H263) {
+                par->codec_id == AV_CODEC_ID_H263 ||
+                par->codec_id == AV_CODEC_ID_HEVC) {
                 int error = s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL;
                 av_log(s, error ? AV_LOG_ERROR : AV_LOG_WARNING,
                        "Codec %s is not supported in the official FLV specification,\n", avcodec_get_name(par->codec_id));
@@ -836,13 +848,13 @@  static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
     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))) {
@@ -862,7 +874,7 @@  static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
                "Packets are not in the proper order with respect to DTS\n");
         return AVERROR(EINVAL);
     }
-    if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) {
+    if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) {
         if (pkt->pts == AV_NOPTS_VALUE) {
             av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n");
             return AVERROR(EINVAL);
@@ -907,6 +919,10 @@  static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
         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_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) {
@@ -968,7 +984,12 @@  static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
         avio_wb32(pb, data_size + 11);
     } else {
         av_assert1(flags>=0);
-        avio_w8(pb,flags);
+        if (par->codec_id == AV_CODEC_ID_HEVC) {
+            avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX); // ExVideoTagHeader mode with PacketTypeCodedFramesX
+            avio_write(pb, "hvc1", 4);
+        } else {
+            avio_w8(pb, flags);
+        }
         if (par->codec_id == AV_CODEC_ID_VP6)
             avio_w8(pb,0);
         if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) {