diff mbox series

[FFmpeg-devel,v3] libavformat/movenc: add support for HEVC in .3gp

Message ID TYAPR01MB4271F9788C856F17F71F4ADBC1CA0@TYAPR01MB4271.jpnprd01.prod.outlook.com
State New
Headers show
Series [FFmpeg-devel,v3] libavformat/movenc: add support for HEVC in .3gp
Related show

Checks

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

Commit Message

Sun Zhenliang Dec. 11, 2020, 4:49 a.m. UTC
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(-)

Comments

Gyan Doshi Dec. 11, 2020, 5:20 a.m. UTC | #1
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
Sun Zhenliang Dec. 11, 2020, 6:03 a.m. UTC | #2
Emmm, I didn't think carefully.
Fixed it now.

Sorry for another patch.

Regards,
Sunzhenliang
Sun Zhenliang Dec. 11, 2020, 9:48 a.m. UTC | #3
>> +        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
Steven Liu Dec. 11, 2020, 10:35 a.m. UTC | #4
> 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 mbox series

Patch

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') },