[FFmpeg-devel] [PATCH] avformat: add a TTA Muxer

James Almer jamrial at gmail.com
Thu Aug 4 22:28:10 EEST 2016


On 8/4/2016 3:38 PM, Michael Niedermayer wrote:
> On Sun, Jul 31, 2016 at 01:03:45PM -0300, James Almer wrote:
>> Signed-off-by: James Almer <jamrial at gmail.com>
> [...]
>> +#include "apetag.h"
>> +#include "avformat.h"
>> +#include "avio_internal.h"
>> +#include "internal.h"
>> +
>> +typedef struct TTAMuxContext {
>> +    AVIOContext *seek_table;
>> +    AVIOContext *data;
>> +    uint32_t nb_samples;
>> +    int frame_size;
>> +    int last_frame;
>> +} TTAMuxContext;
>> +
>> +static int tta_write_header(AVFormatContext *s)
>> +{
>> +    TTAMuxContext *tta = s->priv_data;
>> +    AVCodecParameters *par = s->streams[0]->codecpar;
>> +    int ret;
>> +
>> +    if (s->nb_streams > 1) {
> 
> should be == 1, the code would not work with 0 streams

Fixed.

> 
> 
>> +        av_log(s, AV_LOG_ERROR, "Only one stream is supported\n");
>> +        return AVERROR(EINVAL);
>> +    }
>> +    if (par->codec_id != AV_CODEC_ID_TTA) {
>> +        av_log(s, AV_LOG_ERROR, "Unsupported codec\n");
>> +        return AVERROR(EINVAL);
>> +    }
>> +    if (par->extradata && par->extradata_size < 22) {
>> +        av_log(s, AV_LOG_ERROR, "Invalid TTA extradata\n");
>> +        return AVERROR_INVALIDDATA;
>> +    }
>> +
>> +    if ((ret = avio_open_dyn_buf(&tta->seek_table)) < 0)
>> +        return ret;
>> +    if ((ret = avio_open_dyn_buf(&tta->data)) < 0) {
>> +        ffio_free_dyn_buf(&tta->seek_table);
>> +        return ret;
>> +    }
>> +
>> +    /* Ignore most extradata information if present. It can be innacurate
>> +       if for example remuxing from Matroska */
>> +    ffio_init_checksum(s->pb, ff_crcEDB88320_update, UINT32_MAX);
>> +    ffio_init_checksum(tta->seek_table, ff_crcEDB88320_update, UINT32_MAX);
>> +    avio_write(s->pb, "TTA1", 4);
>> +    avio_wl16(s->pb, par->extradata ? AV_RL16(par->extradata + 4) : 1);
>> +    avio_wl16(s->pb, par->channels);
>> +    avio_wl16(s->pb, par->bits_per_raw_sample);
>> +    avio_wl32(s->pb, par->sample_rate);
> 
>> +    tta->frame_size = par->sample_rate * 256 / 245;
> 
> should use 64bit to avoid overflow

Added a check to make sure sample_rate is a sane value.

> 
> 
> [...]
>> diff --git a/tests/ref/acodec/tta b/tests/ref/acodec/tta
>> index 0f60345..8e183f9 100644
>> --- a/tests/ref/acodec/tta
>> +++ b/tests/ref/acodec/tta
>> @@ -1,4 +1,4 @@
>> -6c260836d7a32e4bd714453a3546c0d5 *tests/data/fate/acodec-tta.matroska
>> -331148 tests/data/fate/acodec-tta.matroska
>> +847d065f082ac94825728b5f1af853eb *tests/data/fate/acodec-tta.tta
>> +330583 tests/data/fate/acodec-tta.tta
>>  95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-tta.out.wav
>>  stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
>> diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka
>> new file mode 100644
>> index 0000000..962b254
>> --- /dev/null
>> +++ b/tests/ref/lavf/mka
>> @@ -0,0 +1,3 @@
>> +b2e3746787b885d0191a1a26f3faa58f *./tests/data/lavf/lavf.mka
>> +43654 ./tests/data/lavf/lavf.mka
>> +./tests/data/lavf/lavf.mka CRC=0x3a1da17e
>> diff --git a/tests/ref/lavf/tta b/tests/ref/lavf/tta
>> new file mode 100644
>> index 0000000..745e8d2
>> --- /dev/null
>> +++ b/tests/ref/lavf/tta
>> @@ -0,0 +1,3 @@
>> +f2721d06704ac43d89fdd25835b43598 *./tests/data/lavf/lavf.tta
>> +43200 ./tests/data/lavf/lavf.tta
>> +./tests/data/lavf/lavf.tta CRC=0x3a1da17e
> 
> fate tests
> Tested-by: Michael on x86 32 / 64, mingw 32/64, mips , arm
> Reviewed-by: Michael

Pushed, thanks.



More information about the ffmpeg-devel mailing list