[vlc-devel] [PATCH] avformat: use avcodec codec_tag as original fourcc
Rafaël Carré
funman at videolan.org
Fri Jan 31 13:01:47 CET 2014
Hello,
On 01/30/14 08:31, Daniel Verkamp wrote:
> On Thu, Jan 30, 2014 at 12:27 AM, Daniel Verkamp <daniel at drv.nu> wrote:
>> Fixes Bink video playback. The Bink video decoder in libavcodec relies
>> on the fourcc to determine the version of the codec.
>> ---
>> modules/demux/avformat/demux.c | 9 +++++++++
>> 1 file changed, 9 insertions(+)
>>
>> diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c
>> index 6e8086e..6bb61f4 100644
>> --- a/modules/demux/avformat/demux.c
>> +++ b/modules/demux/avformat/demux.c
>> @@ -96,6 +96,11 @@ static block_t *BuildSsaFrame( const AVPacket *p_pkt, unsigned i_order );
>> static void UpdateSeekPoint( demux_t *p_demux, int64_t i_time );
>> static void ResetTime( demux_t *p_demux, int64_t i_time );
>>
>> +static vlc_fourcc_t CodecTagToFourcc( uint32_t codec_tag )
>> +{
>> + return VLC_FOURCC( codec_tag & 0xFF, (codec_tag >> 8) & 0xFF, (codec_tag >> 16) & 0xFF, codec_tag >> 24 );
>> +}
>
> Based on the usage of ffmpeg_CodecTag to convert i_original_fourcc in
> the avcodec module, I added a corresponding function to convert from
> codec_tag to vlc_fourcc_t; I couldn't find the equivalent function
> anywhere, but if I missed one, please let me know.
avcodec.h doc says it is a little-endian number, so something like:
#ifdef WORDS_BIGENDIAN
return bswap32(codec_tag);
#else
return codec_tag;
#endif
Will work as vlc_fourcc_t is an uint32_t already
> I also don't have a big-endian machine to test on, but I believe the
> conversion is the correct inverse of ffmpeg_CodecTag.
>
>> +
>> /*****************************************************************************
>> * Open
>> *****************************************************************************/
>> @@ -293,6 +298,7 @@ int OpenDemux( vlc_object_t *p_this )
>> {
>> case AVMEDIA_TYPE_AUDIO:
>> es_format_Init( &fmt, AUDIO_ES, fcc );
>> + fmt.i_original_fourcc = CodecTagToFourcc( cc->codec_tag );
>> fmt.i_bitrate = cc->bit_rate;
>> fmt.audio.i_channels = cc->channels;
>> fmt.audio.i_rate = cc->sample_rate;
>> @@ -303,6 +309,7 @@ int OpenDemux( vlc_object_t *p_this )
>>
>> case AVMEDIA_TYPE_VIDEO:
>> es_format_Init( &fmt, VIDEO_ES, fcc );
>> + fmt.i_original_fourcc = CodecTagToFourcc( cc->codec_tag );
>>
>> fmt.video.i_bits_per_pixel = cc->bits_per_coded_sample;
>> /* Special case for raw video data */
>> @@ -344,6 +351,7 @@ int OpenDemux( vlc_object_t *p_this )
>>
>> case AVMEDIA_TYPE_SUBTITLE:
>> es_format_Init( &fmt, SPU_ES, fcc );
>> + fmt.i_original_fourcc = CodecTagToFourcc( cc->codec_tag );
>> if( strncmp( p_sys->ic->iformat->name, "matroska", 8 ) == 0 &&
>> cc->codec_id == AV_CODEC_ID_DVD_SUBTITLE &&
>> cc->extradata != NULL &&
>> @@ -391,6 +399,7 @@ int OpenDemux( vlc_object_t *p_this )
>>
>> default:
>> es_format_Init( &fmt, UNKNOWN_ES, 0 );
>> + fmt.i_original_fourcc = CodecTagToFourcc( cc->codec_tag );
>
> I don't know if fourcc makes sense for unknown stream types, but I
> don't think it should hurt (codec_tag should be initialized to 0 on
> the avcodec side anyway).
No problem with setting it for unknown stream types.
Maybe the need for setting i_original_fourcc = VLC_FOURCC('a','v','c','1')
is made obsolete by your patch and you can move
fmt.i_original_fourcc = CodecTagToFourcc( cc->codec_tag );
after the switch (cc->codec_type) ?
More information about the vlc-devel
mailing list