Message ID | TYAPR01MB4271F9788C856F17F71F4ADBC1CA0@TYAPR01MB4271.jpnprd01.prod.outlook.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,v3] libavformat/movenc: add support for HEVC in .3gp | expand |
Context | Check | Description |
---|---|---|
andriy/x86_make | success | Make finished |
andriy/x86_make_fate | success | Make fate finished |
andriy/PPC64_make | success | Make finished |
andriy/PPC64_make_fate | success | Make fate finished |
On 11-12-2020 10:19 am, hisunzhenliang@outlook.com wrote: > From: SunZhenliang <hisunzhenliang@outlook.com> > > Just add HEVC's tag in 3gp tag list and it works to support HEVC in > 3gp files. > > Signed-off-by: SunZhenliang <hisunzhenliang@outlook.com> > --- > libavformat/movenc.c | 32 ++++++++++++++++++++++++-------- > 1 file changed, 24 insertions(+), 8 deletions(-) > > diff --git a/libavformat/movenc.c b/libavformat/movenc.c > index 18fa3f9b5e..0c9fd16ce6 100644 > --- a/libavformat/movenc.c > +++ b/libavformat/movenc.c > @@ -4923,7 +4923,7 @@ static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov) > } > > static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s, > - int has_h264, int has_video, int write_minor) > + int has_h2645, int has_video, int write_minor) > { > MOVMuxContext *mov = s->priv_data; > int minor = 0x200; > @@ -4931,11 +4931,11 @@ static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s, > if (mov->major_brand && strlen(mov->major_brand) >= 4) > ffio_wfourcc(pb, mov->major_brand); > else if (mov->mode == MODE_3GP) { > - ffio_wfourcc(pb, has_h264 ? "3gp6" : "3gp4"); > - minor = has_h264 ? 0x100 : 0x200; > + ffio_wfourcc(pb, has_h2645 ? "3gp6" : "3gp4"); > + minor = has_h2645 ? 0x100 : 0x200; > } else if (mov->mode & MODE_3G2) { > - ffio_wfourcc(pb, has_h264 ? "3g2b" : "3g2a"); > - minor = has_h264 ? 0x20000 : 0x10000; > + ffio_wfourcc(pb, has_h2645 ? "3g2b" : "3g2a"); > + minor = has_h2645 ? 0x20000 : 0x10000; > } else if (mov->mode == MODE_PSP) > ffio_wfourcc(pb, "MSNV"); > else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_FRAGMENT && > @@ -4964,7 +4964,8 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) > { > MOVMuxContext *mov = s->priv_data; > int64_t pos = avio_tell(pb); > - int has_h264 = 0, has_av1 = 0, has_video = 0; > + int has_h264 = 0, has_h265 = 0, has_av1 = 0, has_video = 0; > + int h265_codec_tag = 0; int --> uint32_t > int i; > > for (i = 0; i < s->nb_streams; i++) { > @@ -4975,6 +4976,13 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) > has_video = 1; > if (st->codecpar->codec_id == AV_CODEC_ID_H264) > has_h264 = 1; > + if (st->codecpar->codec_id == AV_CODEC_ID_H265){ > + has_h265 = 1; > + if (st->codecpar->codec_tag == MKTAG('h','e','v','1')) > + h265_codec_tag = st->codecpar->codec_tag; > + else > + h265_codec_tag = st->codecpar->codec_tag; > + } Why? Just h265_codec_tag = st->codecpar->codec_tag; > if (st->codecpar->codec_id == AV_CODEC_ID_AV1) > has_av1 = 1; > } > @@ -4983,9 +4991,9 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) > ffio_wfourcc(pb, "ftyp"); > > // Write major brand > - mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 1); > + mov_write_ftyp_tag_internal(pb, s, has_h264 || has_h265 , has_video, 1); > // Write the major brand as the first compatible brand as well > - mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 0); > + mov_write_ftyp_tag_internal(pb, s, has_h264 || has_h265, has_video, 0); > > // Write compatible brands, ensuring that we don't write the major brand as a > // compatible brand a second time. > @@ -5018,6 +5026,12 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) > ffio_wfourcc(pb, "iso2"); > if (has_h264) > ffio_wfourcc(pb, "avc1"); > + if (has_h265){ > + if (h265_codec_tag == MKTAG('h','e','v','1')) > + ffio_wfourcc(pb, "hev1"); > + else > + ffio_wfourcc(pb, "hvc1"); > + } > } > } > > @@ -7103,6 +7117,8 @@ static int mov_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) > static const AVCodecTag codec_3gp_tags[] = { > { AV_CODEC_ID_H263, MKTAG('s','2','6','3') }, > { AV_CODEC_ID_H264, MKTAG('a','v','c','1') }, > + { AV_CODEC_ID_HEVC, MKTAG('h','e','v','1') }, > + { AV_CODEC_ID_HEVC, MKTAG('h','v','c','1') }, > { AV_CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, > { AV_CODEC_ID_AAC, MKTAG('m','p','4','a') }, > { AV_CODEC_ID_AMR_NB, MKTAG('s','a','m','r') }, Regards, Gyan
Emmm, I didn't think carefully. Fixed it now. Sorry for another patch. Regards, Sunzhenliang
>> + if (st->codecpar->codec_id == AV_CODEC_ID_H265){ >pay attention about the code style Sorry, I couldn't see problems in code style. Can you explain it in more detail, it would be helpful. Appreciate and regards, SunZhenliang
> 2020年12月11日 下午5:48,Sun Zhenliang <hisunzhenliang@outlook.com> 写道: > > > >>> + if (st->codecpar->codec_id == AV_CODEC_ID_H265){ >> pay attention about the code style > > Sorry, I couldn't see problems in code style. Can you explain it in more detail, it would be helpful. Space? > > Appreciate and regards, > SunZhenliang > ________________________________ > 发件人: Steven Liu <lq@chinaffmpeg.org> > 发送时间: 2020年12月11日 15:50 > 收件人: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> > 抄送: Steven Liu <lq@chinaffmpeg.org>; hisunzhenliang@outlook.com <hisunzhenliang@outlook.com> > 主题: Re: [FFmpeg-devel] [PATCH, v4] libavformat/movenc: Add support for HEVC in .3gp > > > >> 2020年12月11日 下午1:58,hisunzhenliang@outlook.com 写道: >> >> From: SunZhenliang <hisunzhenliang@outlook.com> >> >> Just add HEVC's tag in 3gp tag list and it works to support HEVC in >> 3gp files. >> >> Signed-off-by: SunZhenliang <hisunzhenliang@outlook.com> >> --- >> libavformat/movenc.c | 29 +++++++++++++++++++++-------- >> 1 file changed, 21 insertions(+), 8 deletions(-) >> >> diff --git a/libavformat/movenc.c b/libavformat/movenc.c >> index 18fa3f9b5e..daf33b634f 100644 >> --- a/libavformat/movenc.c >> +++ b/libavformat/movenc.c >> @@ -4923,7 +4923,7 @@ static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov) >> } >> >> static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s, >> - int has_h264, int has_video, int write_minor) >> + int has_h2645, int has_video, int write_minor) >> { >> MOVMuxContext *mov = s->priv_data; >> int minor = 0x200; >> @@ -4931,11 +4931,11 @@ static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s, >> if (mov->major_brand && strlen(mov->major_brand) >= 4) >> ffio_wfourcc(pb, mov->major_brand); >> else if (mov->mode == MODE_3GP) { >> - ffio_wfourcc(pb, has_h264 ? "3gp6" : "3gp4"); >> - minor = has_h264 ? 0x100 : 0x200; >> + ffio_wfourcc(pb, has_h2645 ? "3gp6" : "3gp4"); >> + minor = has_h2645 ? 0x100 : 0x200; >> } else if (mov->mode & MODE_3G2) { >> - ffio_wfourcc(pb, has_h264 ? "3g2b" : "3g2a"); >> - minor = has_h264 ? 0x20000 : 0x10000; >> + ffio_wfourcc(pb, has_h2645 ? "3g2b" : "3g2a"); >> + minor = has_h2645 ? 0x20000 : 0x10000; >> } else if (mov->mode == MODE_PSP) >> ffio_wfourcc(pb, "MSNV"); >> else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_FRAGMENT && >> @@ -4964,7 +4964,8 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) >> { >> MOVMuxContext *mov = s->priv_data; >> int64_t pos = avio_tell(pb); >> - int has_h264 = 0, has_av1 = 0, has_video = 0; >> + int has_h264 = 0, has_h265 = 0, has_av1 = 0, has_video = 0; >> + uint32_t h265_codec_tag = 0; >> int i; >> >> for (i = 0; i < s->nb_streams; i++) { >> @@ -4975,6 +4976,10 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) >> has_video = 1; >> if (st->codecpar->codec_id == AV_CODEC_ID_H264) >> has_h264 = 1; >> + if (st->codecpar->codec_id == AV_CODEC_ID_H265){ > pay attention about the code style >> + has_h265 = 1; >> + h265_codec_tag = st->codecpar->codec_tag; >> + } >> if (st->codecpar->codec_id == AV_CODEC_ID_AV1) >> has_av1 = 1; >> } >> @@ -4983,9 +4988,9 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) >> ffio_wfourcc(pb, "ftyp"); >> >> // Write major brand >> - mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 1); >> + mov_write_ftyp_tag_internal(pb, s, has_h264 || has_h265 , has_video, 1); >> // Write the major brand as the first compatible brand as well >> - mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 0); >> + mov_write_ftyp_tag_internal(pb, s, has_h264 || has_h265, has_video, 0); >> >> // Write compatible brands, ensuring that we don't write the major brand as a >> // compatible brand a second time. >> @@ -5018,6 +5023,12 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) >> ffio_wfourcc(pb, "iso2"); >> if (has_h264) >> ffio_wfourcc(pb, "avc1"); >> + if (has_h265){ > Ditto > >> + if (h265_codec_tag == MKTAG('h','e','v','1')) >> + ffio_wfourcc(pb, "hev1"); >> + else >> + ffio_wfourcc(pb, "hvc1"); >> + } >> } >> } >> >> @@ -7103,6 +7114,8 @@ static int mov_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) >> static const AVCodecTag codec_3gp_tags[] = { >> { AV_CODEC_ID_H263, MKTAG('s','2','6','3') }, >> { AV_CODEC_ID_H264, MKTAG('a','v','c','1') }, >> + { AV_CODEC_ID_HEVC, MKTAG('h','e','v','1') }, >> + { AV_CODEC_ID_HEVC, MKTAG('h','v','c','1') }, >> { AV_CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, >> { AV_CODEC_ID_AAC, MKTAG('m','p','4','a') }, >> { AV_CODEC_ID_AMR_NB, MKTAG('s','a','m','r') }, >> -- >> 2.20.1 >> >> _______________________________________________ >> 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". > > Other part lgtm. > > Thanks > > Steven Liu > > > > _______________________________________________ > 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". Thanks Steven Liu
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 18fa3f9b5e..0c9fd16ce6 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4923,7 +4923,7 @@ static int mov_write_mdat_tag(AVIOContext *pb, MOVMuxContext *mov) } static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s, - int has_h264, int has_video, int write_minor) + int has_h2645, int has_video, int write_minor) { MOVMuxContext *mov = s->priv_data; int minor = 0x200; @@ -4931,11 +4931,11 @@ static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s, if (mov->major_brand && strlen(mov->major_brand) >= 4) ffio_wfourcc(pb, mov->major_brand); else if (mov->mode == MODE_3GP) { - ffio_wfourcc(pb, has_h264 ? "3gp6" : "3gp4"); - minor = has_h264 ? 0x100 : 0x200; + ffio_wfourcc(pb, has_h2645 ? "3gp6" : "3gp4"); + minor = has_h2645 ? 0x100 : 0x200; } else if (mov->mode & MODE_3G2) { - ffio_wfourcc(pb, has_h264 ? "3g2b" : "3g2a"); - minor = has_h264 ? 0x20000 : 0x10000; + ffio_wfourcc(pb, has_h2645 ? "3g2b" : "3g2a"); + minor = has_h2645 ? 0x20000 : 0x10000; } else if (mov->mode == MODE_PSP) ffio_wfourcc(pb, "MSNV"); else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_FRAGMENT && @@ -4964,7 +4964,8 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) { MOVMuxContext *mov = s->priv_data; int64_t pos = avio_tell(pb); - int has_h264 = 0, has_av1 = 0, has_video = 0; + int has_h264 = 0, has_h265 = 0, has_av1 = 0, has_video = 0; + int h265_codec_tag = 0; int i; for (i = 0; i < s->nb_streams; i++) { @@ -4975,6 +4976,13 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) has_video = 1; if (st->codecpar->codec_id == AV_CODEC_ID_H264) has_h264 = 1; + if (st->codecpar->codec_id == AV_CODEC_ID_H265){ + has_h265 = 1; + if (st->codecpar->codec_tag == MKTAG('h','e','v','1')) + h265_codec_tag = st->codecpar->codec_tag; + else + h265_codec_tag = st->codecpar->codec_tag; + } if (st->codecpar->codec_id == AV_CODEC_ID_AV1) has_av1 = 1; } @@ -4983,9 +4991,9 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) ffio_wfourcc(pb, "ftyp"); // Write major brand - mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 1); + mov_write_ftyp_tag_internal(pb, s, has_h264 || has_h265 , has_video, 1); // Write the major brand as the first compatible brand as well - mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 0); + mov_write_ftyp_tag_internal(pb, s, has_h264 || has_h265, has_video, 0); // Write compatible brands, ensuring that we don't write the major brand as a // compatible brand a second time. @@ -5018,6 +5026,12 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) ffio_wfourcc(pb, "iso2"); if (has_h264) ffio_wfourcc(pb, "avc1"); + if (has_h265){ + if (h265_codec_tag == MKTAG('h','e','v','1')) + ffio_wfourcc(pb, "hev1"); + else + ffio_wfourcc(pb, "hvc1"); + } } } @@ -7103,6 +7117,8 @@ static int mov_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) static const AVCodecTag codec_3gp_tags[] = { { AV_CODEC_ID_H263, MKTAG('s','2','6','3') }, { AV_CODEC_ID_H264, MKTAG('a','v','c','1') }, + { AV_CODEC_ID_HEVC, MKTAG('h','e','v','1') }, + { AV_CODEC_ID_HEVC, MKTAG('h','v','c','1') }, { AV_CODEC_ID_MPEG4, MKTAG('m','p','4','v') }, { AV_CODEC_ID_AAC, MKTAG('m','p','4','a') }, { AV_CODEC_ID_AMR_NB, MKTAG('s','a','m','r') },