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

Michael Niedermayer michael at niedermayer.cc
Thu Aug 4 21:38:11 EEST 2016


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


> +        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


[...]
> 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

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Freedom in capitalist society always remains about the same as it was in
ancient Greek republics: Freedom for slave owners. -- Vladimir Lenin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160804/74d4a047/attachment.sig>


More information about the ffmpeg-devel mailing list