movenc: Allow use of hvc1 tag for h.265

Message ID 20170612150706.10356-1-stebbins@jetheaddev.com
State New
Headers show

Commit Message

John Stebbins June 12, 2017, 3:07 p.m.
If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
---
 libavformat/movenc.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Luca Barbato June 13, 2017, 2:26 p.m. | #1
On 6/12/17 5:07 PM, John Stebbins wrote:
> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
> ---
>  libavformat/movenc.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index e389029..8d89a7a 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>  
>      avio_wb32(pb, 0);
>      ffio_wfourcc(pb, "hvcC");
> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
> +    if (track->tag == MKTAG('h','v','c','1'))
> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
> +    else
> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>      return update_size(pb, pos);
>  }
>  
> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>          return 0;
>  
>      if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
> +             tag == MKTAG('h','v','c','1'))                 ;
>      else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>      else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>      else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>      .write_packet      = mov_write_packet,
>      .write_trailer     = mov_write_trailer,
>      .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
> +    .codec_tag         = (const AVCodecTag* const []){
> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
> +        ff_codec_movsubtitle_tags, 0 },
>      .priv_class        = &mp4_muxer_class,
>  };
>  #endif
> 

Shouldn't hurt, Martin is it fine for you?

lu
Martin Storsjö June 13, 2017, 7:13 p.m. | #2
On Mon, 12 Jun 2017, John Stebbins wrote:

> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
> ---
> libavformat/movenc.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index e389029..8d89a7a 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>
>     avio_wb32(pb, 0);
>     ffio_wfourcc(pb, "hvcC");
> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
> +    if (track->tag == MKTAG('h','v','c','1'))
> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
> +    else
> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>     return update_size(pb, pos);
> }
> 
> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>         return 0;
>
>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
> +             tag == MKTAG('h','v','c','1'))                 ;
>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>     .write_packet      = mov_write_packet,
>     .write_trailer     = mov_write_trailer,
>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
> +    .codec_tag         = (const AVCodecTag* const []){
> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
> +        ff_codec_movsubtitle_tags, 0 },
>     .priv_class        = &mp4_muxer_class,

I guess this change is because libavformat refuses to allow you to set a 
custom codec_tag unless it is found in the codec_tag list, right? Does 
this have any other practical implications? I feel a little uneasy about 
this part of it...

// Martin
John Stebbins June 14, 2017, 1:20 a.m. | #3
On 06/13/2017 12:13 PM, Martin Storsjö wrote:
> On Mon, 12 Jun 2017, John Stebbins wrote:
>
>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>> ---
>> libavformat/movenc.c | 11 +++++++++--
>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>> index e389029..8d89a7a 100644
>> --- a/libavformat/movenc.c
>> +++ b/libavformat/movenc.c
>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>
>>     avio_wb32(pb, 0);
>>     ffio_wfourcc(pb, "hvcC");
>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>> +    if (track->tag == MKTAG('h','v','c','1'))
>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>> +    else
>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>     return update_size(pb, pos);
>> }
>>
>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>         return 0;
>>
>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>> +             tag == MKTAG('h','v','c','1'))                 ;
>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>     .write_packet      = mov_write_packet,
>>     .write_trailer     = mov_write_trailer,
>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>> +    .codec_tag         = (const AVCodecTag* const []){
>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>> +        ff_codec_movsubtitle_tags, 0 },
>>     .priv_class        = &mp4_muxer_class,
> I guess this change is because libavformat refuses to allow you to set a 
> custom codec_tag unless it is found in the codec_tag list, right? Does 
> this have any other practical implications? I feel a little uneasy about 
> this part of it...
>
>

Yes, this change was to fix result of validate_codec_tag in mux.c.

I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
consistently. It's only used by avformat_write_header.

I also ran fate to check for regressions.
Martin Storsjö June 14, 2017, 6:16 a.m. | #4
On Tue, 13 Jun 2017, John Stebbins wrote:

> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>
>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>> ---
>>> libavformat/movenc.c | 11 +++++++++--
>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>> index e389029..8d89a7a 100644
>>> --- a/libavformat/movenc.c
>>> +++ b/libavformat/movenc.c
>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>
>>>     avio_wb32(pb, 0);
>>>     ffio_wfourcc(pb, "hvcC");
>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>> +    else
>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>     return update_size(pb, pos);
>>> }
>>>
>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>         return 0;
>>>
>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>     .write_packet      = mov_write_packet,
>>>     .write_trailer     = mov_write_trailer,
>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>> +    .codec_tag         = (const AVCodecTag* const []){
>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>> +        ff_codec_movsubtitle_tags, 0 },
>>>     .priv_class        = &mp4_muxer_class,
>> I guess this change is because libavformat refuses to allow you to set a
>> custom codec_tag unless it is found in the codec_tag list, right? Does
>> this have any other practical implications? I feel a little uneasy about
>> this part of it...
>>
>>
>
> Yes, this change was to fix result of validate_codec_tag in mux.c.
>
> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
> consistently. It's only used by avformat_write_header.
>
> I also ran fate to check for regressions.

Ok, that makes sense.

In that case though, I would very much prefer to do this in two separate 
steps; one that removes the .codec_tag part from the AVOutputFormat, with 
a thorough explanation of this (pretty much what you just wrote) and 
saying that this will allow the caller to indicate that actual codec tag 
he wants to be used, and then this one on top that allows you to use hvc1.

// Martin
John Stebbins June 14, 2017, 2:19 p.m. | #5
On 06/13/2017 11:16 PM, Martin Storsjö wrote:
> On Tue, 13 Jun 2017, John Stebbins wrote:
>
>> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>>
>>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>>> ---
>>>> libavformat/movenc.c | 11 +++++++++--
>>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>>> index e389029..8d89a7a 100644
>>>> --- a/libavformat/movenc.c
>>>> +++ b/libavformat/movenc.c
>>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>>
>>>>     avio_wb32(pb, 0);
>>>>     ffio_wfourcc(pb, "hvcC");
>>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>>> +    else
>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>     return update_size(pb, pos);
>>>> }
>>>>
>>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>>         return 0;
>>>>
>>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>>     .write_packet      = mov_write_packet,
>>>>     .write_trailer     = mov_write_trailer,
>>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>>> +    .codec_tag         = (const AVCodecTag* const []){
>>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>>> +        ff_codec_movsubtitle_tags, 0 },
>>>>     .priv_class        = &mp4_muxer_class,
>>> I guess this change is because libavformat refuses to allow you to set a
>>> custom codec_tag unless it is found in the codec_tag list, right? Does
>>> this have any other practical implications? I feel a little uneasy about
>>> this part of it...
>>>
>>>
>> Yes, this change was to fix result of validate_codec_tag in mux.c.
>>
>> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
>> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
>> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
>> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
>> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
>> consistently. It's only used by avformat_write_header.
>>
>> I also ran fate to check for regressions.
> Ok, that makes sense.
>
> In that case though, I would very much prefer to do this in two separate 
> steps; one that removes the .codec_tag part from the AVOutputFormat, with 
> a thorough explanation of this (pretty much what you just wrote) and 
> saying that this will allow the caller to indicate that actual codec tag 
> he wants to be used, and then this one on top that allows you to use hvc1.
>
>

Ok, I'll do that.  There are 2 additional places ff_mp4_obj_type is used for codec_tag.  psp and ismv also use it. 
Should I just do the same thing to them, or would you rather something more tailored for those use cases (as it is done
for ipod)?  I don't happen to know what fourcc are permitted in these variants.  There's nothing in the code that
currently limits what can be put in these.
Martin Storsjö June 14, 2017, 7:13 p.m. | #6
On Wed, 14 Jun 2017, John Stebbins wrote:

> On 06/13/2017 11:16 PM, Martin Storsjö wrote:
>> On Tue, 13 Jun 2017, John Stebbins wrote:
>>
>>> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>>>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>>>
>>>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>>>> ---
>>>>> libavformat/movenc.c | 11 +++++++++--
>>>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>>>> index e389029..8d89a7a 100644
>>>>> --- a/libavformat/movenc.c
>>>>> +++ b/libavformat/movenc.c
>>>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>>>
>>>>>     avio_wb32(pb, 0);
>>>>>     ffio_wfourcc(pb, "hvcC");
>>>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>>>> +    else
>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>     return update_size(pb, pos);
>>>>> }
>>>>>
>>>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>>>         return 0;
>>>>>
>>>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>>>     .write_packet      = mov_write_packet,
>>>>>     .write_trailer     = mov_write_trailer,
>>>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>>>> +    .codec_tag         = (const AVCodecTag* const []){
>>>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>>>> +        ff_codec_movsubtitle_tags, 0 },
>>>>>     .priv_class        = &mp4_muxer_class,
>>>> I guess this change is because libavformat refuses to allow you to set a
>>>> custom codec_tag unless it is found in the codec_tag list, right? Does
>>>> this have any other practical implications? I feel a little uneasy about
>>>> this part of it...
>>>>
>>>>
>>> Yes, this change was to fix result of validate_codec_tag in mux.c.
>>>
>>> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
>>> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
>>> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
>>> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
>>> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
>>> consistently. It's only used by avformat_write_header.
>>>
>>> I also ran fate to check for regressions.
>> Ok, that makes sense.
>>
>> In that case though, I would very much prefer to do this in two separate
>> steps; one that removes the .codec_tag part from the AVOutputFormat, with
>> a thorough explanation of this (pretty much what you just wrote) and
>> saying that this will allow the caller to indicate that actual codec tag
>> he wants to be used, and then this one on top that allows you to use hvc1.
>>
>>
>
> Ok, I'll do that.  There are 2 additional places ff_mp4_obj_type is used for codec_tag.  psp and ismv also use it.
> Should I just do the same thing to them, or would you rather something more tailored for those use cases (as it is done
> for ipod)?  I don't happen to know what fourcc are permitted in these variants.  There's nothing in the code that
> currently limits what can be put in these.

Hmm, after removing codec_tag in this case, what happens if you try to mux 
an unsupported codec? Would it be even better to use another list like the 
current one, but which contains the actual real tags that can end up 
written in the mp4 file, so you can have both HEVC alternatives in there?

// Martin
John Stebbins June 14, 2017, 7:58 p.m. | #7
On 06/14/2017 12:13 PM, Martin Storsjö wrote:
> On Wed, 14 Jun 2017, John Stebbins wrote:
>
>> On 06/13/2017 11:16 PM, Martin Storsjö wrote:
>>> On Tue, 13 Jun 2017, John Stebbins wrote:
>>>
>>>> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>>>>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>>>>
>>>>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>>>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>>>>> ---
>>>>>> libavformat/movenc.c | 11 +++++++++--
>>>>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>>>>> index e389029..8d89a7a 100644
>>>>>> --- a/libavformat/movenc.c
>>>>>> +++ b/libavformat/movenc.c
>>>>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>>>>
>>>>>>     avio_wb32(pb, 0);
>>>>>>     ffio_wfourcc(pb, "hvcC");
>>>>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>>>>> +    else
>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>     return update_size(pb, pos);
>>>>>> }
>>>>>>
>>>>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>>>>         return 0;
>>>>>>
>>>>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>>>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>>>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>>>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>>>>     .write_packet      = mov_write_packet,
>>>>>>     .write_trailer     = mov_write_trailer,
>>>>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>>>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>>>>> +    .codec_tag         = (const AVCodecTag* const []){
>>>>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>>>>> +        ff_codec_movsubtitle_tags, 0 },
>>>>>>     .priv_class        = &mp4_muxer_class,
>>>>> I guess this change is because libavformat refuses to allow you to set a
>>>>> custom codec_tag unless it is found in the codec_tag list, right? Does
>>>>> this have any other practical implications? I feel a little uneasy about
>>>>> this part of it...
>>>>>
>>>>>
>>>> Yes, this change was to fix result of validate_codec_tag in mux.c.
>>>>
>>>> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
>>>> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
>>>> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
>>>> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
>>>> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
>>>> consistently. It's only used by avformat_write_header.
>>>>
>>>> I also ran fate to check for regressions.
>>> Ok, that makes sense.
>>>
>>> In that case though, I would very much prefer to do this in two separate
>>> steps; one that removes the .codec_tag part from the AVOutputFormat, with
>>> a thorough explanation of this (pretty much what you just wrote) and
>>> saying that this will allow the caller to indicate that actual codec tag
>>> he wants to be used, and then this one on top that allows you to use hvc1.
>>>
>>>
>> Ok, I'll do that.  There are 2 additional places ff_mp4_obj_type is used for codec_tag.  psp and ismv also use it.
>> Should I just do the same thing to them, or would you rather something more tailored for those use cases (as it is done
>> for ipod)?  I don't happen to know what fourcc are permitted in these variants.  There's nothing in the code that
>> currently limits what can be put in these.
> Hmm, after removing codec_tag in this case, what happens if you try to mux 
> an unsupported codec? Would it be even better to use another list like the 
> current one, but which contains the actual real tags that can end up 
> written in the mp4 file, so you can have both HEVC alternatives in there?
>
>

I think you misread something.  I didn't "remove" codec_tag.  I set it to { ff_codec_movvideo_tags,
ff_codec_movaudio_tags, ff_codec_movsubtitle_tags, 0 }
Martin Storsjö June 14, 2017, 8:06 p.m. | #8
On Wed, 14 Jun 2017, John Stebbins wrote:

>
>
> On 06/14/2017 12:13 PM, Martin Storsjö wrote:
>> On Wed, 14 Jun 2017, John Stebbins wrote:
>>
>>> On 06/13/2017 11:16 PM, Martin Storsjö wrote:
>>>> On Tue, 13 Jun 2017, John Stebbins wrote:
>>>>
>>>>> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>>>>>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>>>>>
>>>>>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>>>>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>>>>>> ---
>>>>>>> libavformat/movenc.c | 11 +++++++++--
>>>>>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>>>>>
>>>>>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>>>>>> index e389029..8d89a7a 100644
>>>>>>> --- a/libavformat/movenc.c
>>>>>>> +++ b/libavformat/movenc.c
>>>>>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>>>>>
>>>>>>>     avio_wb32(pb, 0);
>>>>>>>     ffio_wfourcc(pb, "hvcC");
>>>>>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>>>>>> +    else
>>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>>     return update_size(pb, pos);
>>>>>>> }
>>>>>>>
>>>>>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>>>>>         return 0;
>>>>>>>
>>>>>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>>>>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>>>>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>>>>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>>>>>     .write_packet      = mov_write_packet,
>>>>>>>     .write_trailer     = mov_write_trailer,
>>>>>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>>>>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>>>>>> +    .codec_tag         = (const AVCodecTag* const []){
>>>>>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>>>>>> +        ff_codec_movsubtitle_tags, 0 },
>>>>>>>     .priv_class        = &mp4_muxer_class,
>>>>>> I guess this change is because libavformat refuses to allow you to set a
>>>>>> custom codec_tag unless it is found in the codec_tag list, right? Does
>>>>>> this have any other practical implications? I feel a little uneasy about
>>>>>> this part of it...
>>>>>>
>>>>>>
>>>>> Yes, this change was to fix result of validate_codec_tag in mux.c.
>>>>>
>>>>> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
>>>>> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
>>>>> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
>>>>> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
>>>>> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
>>>>> consistently. It's only used by avformat_write_header.
>>>>>
>>>>> I also ran fate to check for regressions.
>>>> Ok, that makes sense.
>>>>
>>>> In that case though, I would very much prefer to do this in two separate
>>>> steps; one that removes the .codec_tag part from the AVOutputFormat, with
>>>> a thorough explanation of this (pretty much what you just wrote) and
>>>> saying that this will allow the caller to indicate that actual codec tag
>>>> he wants to be used, and then this one on top that allows you to use hvc1.
>>>>
>>>>
>>> Ok, I'll do that.  There are 2 additional places ff_mp4_obj_type is used for codec_tag.  psp and ismv also use it.
>>> Should I just do the same thing to them, or would you rather something more tailored for those use cases (as it is done
>>> for ipod)?  I don't happen to know what fourcc are permitted in these variants.  There's nothing in the code that
>>> currently limits what can be put in these.
>> Hmm, after removing codec_tag in this case, what happens if you try to mux
>> an unsupported codec? Would it be even better to use another list like the
>> current one, but which contains the actual real tags that can end up
>> written in the mp4 file, so you can have both HEVC alternatives in there?
>>
>>
>
> I think you misread something.  I didn't "remove" codec_tag.  I set it to { ff_codec_movvideo_tags,
> ff_codec_movaudio_tags, ff_codec_movsubtitle_tags, 0 }

Yep, and now on a second thought I think that's wrong. Wouldn't that allow 
you to (attempt to) mux codecs which really aren't supposed to go into an 
mp4, say SVQ3?

So instead it'd be better to mirror the actual list of codecs that are 
allowed in mp4, that currently are in ff_mp4_obj_type, but with sensible 
tag names (including both hev1 and hvc1)?

// Martin
John Stebbins June 14, 2017, 10:34 p.m. | #9
On 06/14/2017 01:06 PM, Martin Storsjö wrote:
> On Wed, 14 Jun 2017, John Stebbins wrote:
>
>>
>> On 06/14/2017 12:13 PM, Martin Storsjö wrote:
>>> On Wed, 14 Jun 2017, John Stebbins wrote:
>>>
>>>> On 06/13/2017 11:16 PM, Martin Storsjö wrote:
>>>>> On Tue, 13 Jun 2017, John Stebbins wrote:
>>>>>
>>>>>> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>>>>>>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>>>>>>
>>>>>>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>>>>>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>>>>>>> ---
>>>>>>>> libavformat/movenc.c | 11 +++++++++--
>>>>>>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>>>>>>> index e389029..8d89a7a 100644
>>>>>>>> --- a/libavformat/movenc.c
>>>>>>>> +++ b/libavformat/movenc.c
>>>>>>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>>>>>>
>>>>>>>>     avio_wb32(pb, 0);
>>>>>>>>     ffio_wfourcc(pb, "hvcC");
>>>>>>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>>>>>>> +    else
>>>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>>>     return update_size(pb, pos);
>>>>>>>> }
>>>>>>>>
>>>>>>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>>>>>>         return 0;
>>>>>>>>
>>>>>>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>>>>>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>>>>>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>>>>>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>>>>>>     .write_packet      = mov_write_packet,
>>>>>>>>     .write_trailer     = mov_write_trailer,
>>>>>>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>>>>>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>>>>>>> +    .codec_tag         = (const AVCodecTag* const []){
>>>>>>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>>>>>>> +        ff_codec_movsubtitle_tags, 0 },
>>>>>>>>     .priv_class        = &mp4_muxer_class,
>>>>>>> I guess this change is because libavformat refuses to allow you to set a
>>>>>>> custom codec_tag unless it is found in the codec_tag list, right? Does
>>>>>>> this have any other practical implications? I feel a little uneasy about
>>>>>>> this part of it...
>>>>>>>
>>>>>>>
>>>>>> Yes, this change was to fix result of validate_codec_tag in mux.c.
>>>>>>
>>>>>> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
>>>>>> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
>>>>>> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
>>>>>> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
>>>>>> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
>>>>>> consistently. It's only used by avformat_write_header.
>>>>>>
>>>>>> I also ran fate to check for regressions.
>>>>> Ok, that makes sense.
>>>>>
>>>>> In that case though, I would very much prefer to do this in two separate
>>>>> steps; one that removes the .codec_tag part from the AVOutputFormat, with
>>>>> a thorough explanation of this (pretty much what you just wrote) and
>>>>> saying that this will allow the caller to indicate that actual codec tag
>>>>> he wants to be used, and then this one on top that allows you to use hvc1.
>>>>>
>>>>>
>>>> Ok, I'll do that.  There are 2 additional places ff_mp4_obj_type is used for codec_tag.  psp and ismv also use it.
>>>> Should I just do the same thing to them, or would you rather something more tailored for those use cases (as it is done
>>>> for ipod)?  I don't happen to know what fourcc are permitted in these variants.  There's nothing in the code that
>>>> currently limits what can be put in these.
>>> Hmm, after removing codec_tag in this case, what happens if you try to mux
>>> an unsupported codec? Would it be even better to use another list like the
>>> current one, but which contains the actual real tags that can end up
>>> written in the mp4 file, so you can have both HEVC alternatives in there?
>>>
>>>
>> I think you misread something.  I didn't "remove" codec_tag.  I set it to { ff_codec_movvideo_tags,
>> ff_codec_movaudio_tags, ff_codec_movsubtitle_tags, 0 }
> Yep, and now on a second thought I think that's wrong. Wouldn't that allow 
> you to (attempt to) mux codecs which really aren't supposed to go into an 
> mp4, say SVQ3?
>
> So instead it'd be better to mirror the actual list of codecs that are 
> allowed in mp4, that currently are in ff_mp4_obj_type, but with sensible 
> tag names (including both hev1 and hvc1)?
>
>

Understood.  I assumed mov and mp4 allowed pretty much the same stream types.  But I see this is incorrect. I'll roll
that into a new patch.  Do you want to have a more limited list for psp and/or ismv?  If so, do you happen to know a
good source for what should be in that list?
Martin Storsjö June 15, 2017, 6:20 a.m. | #10
On Wed, 14 Jun 2017, John Stebbins wrote:

>
> On 06/14/2017 01:06 PM, Martin Storsjö wrote:
>> On Wed, 14 Jun 2017, John Stebbins wrote:
>>
>>>
>>> On 06/14/2017 12:13 PM, Martin Storsjö wrote:
>>>> On Wed, 14 Jun 2017, John Stebbins wrote:
>>>>
>>>>> On 06/13/2017 11:16 PM, Martin Storsjö wrote:
>>>>>> On Tue, 13 Jun 2017, John Stebbins wrote:
>>>>>>
>>>>>>> On 06/13/2017 12:13 PM, Martin Storsjö wrote:
>>>>>>>> On Mon, 12 Jun 2017, John Stebbins wrote:
>>>>>>>>
>>>>>>>>> If AVCodecParameters.codec_tag is 'hvc1' use it instead of 'hev1' for
>>>>>>>>> h.265 streams. QuickTime (and other Apple software) requires 'hvc1'.
>>>>>>>>> ---
>>>>>>>>> libavformat/movenc.c | 11 +++++++++--
>>>>>>>>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>>>>>>>>
>>>>>>>>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>>>>>>>>> index e389029..8d89a7a 100644
>>>>>>>>> --- a/libavformat/movenc.c
>>>>>>>>> +++ b/libavformat/movenc.c
>>>>>>>>> @@ -726,7 +726,10 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
>>>>>>>>>
>>>>>>>>>     avio_wb32(pb, 0);
>>>>>>>>>     ffio_wfourcc(pb, "hvcC");
>>>>>>>>> -    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>>>> +    if (track->tag == MKTAG('h','v','c','1'))
>>>>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
>>>>>>>>> +    else
>>>>>>>>> +        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
>>>>>>>>>     return update_size(pb, pos);
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> @@ -786,6 +789,8 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
>>>>>>>>>         return 0;
>>>>>>>>>
>>>>>>>>>     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
>>>>>>>>> +    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
>>>>>>>>> +             tag == MKTAG('h','v','c','1'))                 ;
>>>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
>>>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
>>>>>>>>>     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
>>>>>>>>> @@ -4496,7 +4501,9 @@ AVOutputFormat ff_mp4_muxer = {
>>>>>>>>>     .write_packet      = mov_write_packet,
>>>>>>>>>     .write_trailer     = mov_write_trailer,
>>>>>>>>>     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
>>>>>>>>> -    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
>>>>>>>>> +    .codec_tag         = (const AVCodecTag* const []){
>>>>>>>>> +        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
>>>>>>>>> +        ff_codec_movsubtitle_tags, 0 },
>>>>>>>>>     .priv_class        = &mp4_muxer_class,
>>>>>>>> I guess this change is because libavformat refuses to allow you to set a
>>>>>>>> custom codec_tag unless it is found in the codec_tag list, right? Does
>>>>>>>> this have any other practical implications? I feel a little uneasy about
>>>>>>>> this part of it...
>>>>>>>>
>>>>>>>>
>>>>>>> Yes, this change was to fix result of validate_codec_tag in mux.c.
>>>>>>>
>>>>>>> I was curious about this myself.  I could only find 2 places that this codec_tag array is used.  One in
>>>>>>> validate_codec_tag which is the instance that needed fixing, and another in avconv where it is checking if the source
>>>>>>> codec_tag is valid for the output format when doing stream copy.  In both of these cases ff_mp4_obj_type is wrong for
>>>>>>> codec_tag so I'm not sure why this was used in the first place. According to git history, this was used from the
>>>>>>> beginning, but makes no sense. I also looked at who calls validate_codec_tag just to be sure it's being used
>>>>>>> consistently. It's only used by avformat_write_header.
>>>>>>>
>>>>>>> I also ran fate to check for regressions.
>>>>>> Ok, that makes sense.
>>>>>>
>>>>>> In that case though, I would very much prefer to do this in two separate
>>>>>> steps; one that removes the .codec_tag part from the AVOutputFormat, with
>>>>>> a thorough explanation of this (pretty much what you just wrote) and
>>>>>> saying that this will allow the caller to indicate that actual codec tag
>>>>>> he wants to be used, and then this one on top that allows you to use hvc1.
>>>>>>
>>>>>>
>>>>> Ok, I'll do that.  There are 2 additional places ff_mp4_obj_type is used for codec_tag.  psp and ismv also use it.
>>>>> Should I just do the same thing to them, or would you rather something more tailored for those use cases (as it is done
>>>>> for ipod)?  I don't happen to know what fourcc are permitted in these variants.  There's nothing in the code that
>>>>> currently limits what can be put in these.
>>>> Hmm, after removing codec_tag in this case, what happens if you try to mux
>>>> an unsupported codec? Would it be even better to use another list like the
>>>> current one, but which contains the actual real tags that can end up
>>>> written in the mp4 file, so you can have both HEVC alternatives in there?
>>>>
>>>>
>>> I think you misread something.  I didn't "remove" codec_tag.  I set it to { ff_codec_movvideo_tags,
>>> ff_codec_movaudio_tags, ff_codec_movsubtitle_tags, 0 }
>> Yep, and now on a second thought I think that's wrong. Wouldn't that allow
>> you to (attempt to) mux codecs which really aren't supposed to go into an
>> mp4, say SVQ3?
>>
>> So instead it'd be better to mirror the actual list of codecs that are
>> allowed in mp4, that currently are in ff_mp4_obj_type, but with sensible
>> tag names (including both hev1 and hvc1)?
>>
>>
>
> Understood.  I assumed mov and mp4 allowed pretty much the same stream types.  But I see this is incorrect. I'll roll
> that into a new patch.  Do you want to have a more limited list for psp and/or ismv?  If so, do you happen to know a
> good source for what should be in that list?

I don't really know about psp (perhaps leave that untouched)? For ismv, I 
guess the same things as plain mp4 should be fine.

// Martin

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index e389029..8d89a7a 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -726,7 +726,10 @@  static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
 
     avio_wb32(pb, 0);
     ffio_wfourcc(pb, "hvcC");
-    ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
+    if (track->tag == MKTAG('h','v','c','1'))
+        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 1);
+    else
+        ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
     return update_size(pb, pos);
 }
 
@@ -786,6 +789,8 @@  static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
         return 0;
 
     if      (track->par->codec_id == AV_CODEC_ID_H264)      tag = MKTAG('a','v','c','1');
+    else if (track->par->codec_id == AV_CODEC_ID_HEVC &&
+             tag == MKTAG('h','v','c','1'))                 ;
     else if (track->par->codec_id == AV_CODEC_ID_HEVC)      tag = MKTAG('h','e','v','1');
     else if (track->par->codec_id == AV_CODEC_ID_AC3)       tag = MKTAG('a','c','-','3');
     else if (track->par->codec_id == AV_CODEC_ID_DIRAC)     tag = MKTAG('d','r','a','c');
@@ -4496,7 +4501,9 @@  AVOutputFormat ff_mp4_muxer = {
     .write_packet      = mov_write_packet,
     .write_trailer     = mov_write_trailer,
     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
-    .codec_tag         = (const AVCodecTag* const []){ ff_mp4_obj_type, 0 },
+    .codec_tag         = (const AVCodecTag* const []){
+        ff_codec_movvideo_tags, ff_codec_movaudio_tags,
+        ff_codec_movsubtitle_tags, 0 },
     .priv_class        = &mp4_muxer_class,
 };
 #endif