static int tta_read_header(AVFormatContext *s)

{

    TTAContext *c = s->priv_data;

    AVStream *st;

    int i, channels, bps, samplerate;

    uint64_t framepos, start_offset;

    uint32_t nb_samples, crc;



    ff_id3v1_read(s);



    start_offset = avio_tell(s->pb);

    ffio_init_checksum(s->pb, tta_check_crc, UINT32_MAX);

    if (avio_rl32(s->pb) != AV_RL32("TTA1"))

        return AVERROR_INVALIDDATA;



    avio_skip(s->pb, 2); // FIXME: flags

    channels = avio_rl16(s->pb);

    bps = avio_rl16(s->pb);

    samplerate = avio_rl32(s->pb);

    if(samplerate <= 0 || samplerate > 1000000){

        av_log(s, AV_LOG_ERROR, "nonsense samplerate\n");

        return AVERROR_INVALIDDATA;

    }



    nb_samples = avio_rl32(s->pb);

    if (!nb_samples) {

        av_log(s, AV_LOG_ERROR, "invalid number of samples\n");

        return AVERROR_INVALIDDATA;

    }



    crc = ffio_get_checksum(s->pb) ^ UINT32_MAX;

    if (crc != avio_rl32(s->pb)) {

        av_log(s, AV_LOG_ERROR, "Header CRC error\n");

        return AVERROR_INVALIDDATA;

    }



    c->frame_size      = samplerate * 256 / 245;

    c->last_frame_size = nb_samples % c->frame_size;

    if (!c->last_frame_size)

        c->last_frame_size = c->frame_size;

    c->totalframes = nb_samples / c->frame_size + (c->last_frame_size < c->frame_size);

    c->currentframe = 0;



    if(c->totalframes >= UINT_MAX/sizeof(uint32_t) || c->totalframes <= 0){

        av_log(s, AV_LOG_ERROR, "totalframes %d invalid\n", c->totalframes);

        return AVERROR_INVALIDDATA;

    }



    st = avformat_new_stream(s, NULL);

    if (!st)

        return AVERROR(ENOMEM);



    avpriv_set_pts_info(st, 64, 1, samplerate);

    st->start_time = 0;

    st->duration = nb_samples;



    framepos = avio_tell(s->pb) + 4*c->totalframes + 4;



    if (ff_alloc_extradata(st->codec, avio_tell(s->pb) - start_offset))

        return AVERROR(ENOMEM);



    avio_seek(s->pb, start_offset, SEEK_SET);

    avio_read(s->pb, st->codec->extradata, st->codec->extradata_size);



    ffio_init_checksum(s->pb, tta_check_crc, UINT32_MAX);

    for (i = 0; i < c->totalframes; i++) {

        uint32_t size = avio_rl32(s->pb);

        av_add_index_entry(st, framepos, i * c->frame_size, size, 0,

                           AVINDEX_KEYFRAME);

        framepos += size;

    }

    crc = ffio_get_checksum(s->pb) ^ UINT32_MAX;

    if (crc != avio_rl32(s->pb)) {

        av_log(s, AV_LOG_ERROR, "Seek table CRC error\n");

        return AVERROR_INVALIDDATA;

    }



    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;

    st->codec->codec_id = AV_CODEC_ID_TTA;

    st->codec->channels = channels;

    st->codec->sample_rate = samplerate;

    st->codec->bits_per_coded_sample = bps;



    if (s->pb->seekable) {

        int64_t pos = avio_tell(s->pb);

        ff_ape_parse_tag(s);

        avio_seek(s->pb, pos, SEEK_SET);

    }



    return 0;

}

static int tta_read_header(AVFormatContext *s)

{

    TTAContext *c = s->priv_data;

    AVStream *st;

    int i, channels, bps, samplerate;

    uint64_t framepos, start_offset;

    uint32_t nb_samples, crc;



    ff_id3v1_read(s);



    start_offset = avio_tell(s->pb);

    ffio_init_checksum(s->pb, tta_check_crc, UINT32_MAX);

    if (avio_rl32(s->pb) != AV_RL32("TTA1"))

        return AVERROR_INVALIDDATA;



    avio_skip(s->pb, 2); 

    channels = avio_rl16(s->pb);

    bps = avio_rl16(s->pb);

    samplerate = avio_rl32(s->pb);

    if(samplerate <= 0 || samplerate > 1000000){

        av_log(s, AV_LOG_ERROR, "nonsense samplerate\n");

        return AVERROR_INVALIDDATA;

    }



    nb_samples = avio_rl32(s->pb);

    if (!nb_samples) {

        av_log(s, AV_LOG_ERROR, "invalid number of samples\n");

        return AVERROR_INVALIDDATA;

    }



    crc = ffio_get_checksum(s->pb) ^ UINT32_MAX;

    if (crc != avio_rl32(s->pb)) {

        av_log(s, AV_LOG_ERROR, "Header CRC error\n");

        return AVERROR_INVALIDDATA;

    }



    c->frame_size      = samplerate * 256 / 245;

    c->last_frame_size = nb_samples % c->frame_size;

    if (!c->last_frame_size)

        c->last_frame_size = c->frame_size;

    c->totalframes = nb_samples / c->frame_size + (c->last_frame_size < c->frame_size);

    c->currentframe = 0;



    if(c->totalframes >= UINT_MAX/sizeof(uint32_t) || c->totalframes <= 0){

        av_log(s, AV_LOG_ERROR, "totalframes %d invalid\n", c->totalframes);

        return AVERROR_INVALIDDATA;

    }



    st = avformat_new_stream(s, NULL);

    if (!st)

        return AVERROR(ENOMEM);



    avpriv_set_pts_info(st, 64, 1, samplerate);

    st->start_time = 0;

    st->duration = nb_samples;



    framepos = avio_tell(s->pb) + 4*c->totalframes + 4;



    if (ff_alloc_extradata(st->codec, avio_tell(s->pb) - start_offset))

        return AVERROR(ENOMEM);



    avio_seek(s->pb, start_offset, SEEK_SET);

    avio_read(s->pb, st->codec->extradata, st->codec->extradata_size);



    ffio_init_checksum(s->pb, tta_check_crc, UINT32_MAX);

    for (i = 0; i < c->totalframes; i++) {

        uint32_t size = avio_rl32(s->pb);

        av_add_index_entry(st, framepos, i * c->frame_size, size, 0,

                           AVINDEX_KEYFRAME);

        framepos += size;

    }

    crc = ffio_get_checksum(s->pb) ^ UINT32_MAX;

    if (crc != avio_rl32(s->pb)) {

        av_log(s, AV_LOG_ERROR, "Seek table CRC error\n");

        return AVERROR_INVALIDDATA;

    }



    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;

    st->codec->codec_id = AV_CODEC_ID_TTA;

    st->codec->channels = channels;

    st->codec->sample_rate = samplerate;

    st->codec->bits_per_coded_sample = bps;



    if (s->pb->seekable) {

        int64_t pos = avio_tell(s->pb);

        ff_ape_parse_tag(s);

        avio_seek(s->pb, pos, SEEK_SET);

    }



    return 0;

}

        av_add_index_entry(st, framepos, i * c->frame_size, size, 0,                            AVINDEX_KEYFRAME);
static int FUNC_0(AVFormatContext *VAR_0)

{

    TTAContext *c = VAR_0->priv_data;

    AVStream *st;

    int VAR_1, VAR_2, VAR_3, VAR_4;

    uint64_t framepos, start_offset;

    uint32_t nb_samples, crc;



    ff_id3v1_read(VAR_0);



    start_offset = avio_tell(VAR_0->pb);

    ffio_init_checksum(VAR_0->pb, tta_check_crc, UINT32_MAX);

    if (avio_rl32(VAR_0->pb) != AV_RL32("TTA1"))

        return AVERROR_INVALIDDATA;



    avio_skip(VAR_0->pb, 2); 

    VAR_2 = avio_rl16(VAR_0->pb);

    VAR_3 = avio_rl16(VAR_0->pb);

    VAR_4 = avio_rl32(VAR_0->pb);

    if(VAR_4 <= 0 || VAR_4 > 1000000){

        av_log(VAR_0, AV_LOG_ERROR, "nonsense VAR_4\n");

        return AVERROR_INVALIDDATA;

    }



    nb_samples = avio_rl32(VAR_0->pb);

    if (!nb_samples) {

        av_log(VAR_0, AV_LOG_ERROR, "invalid number of samples\n");

        return AVERROR_INVALIDDATA;

    }



    crc = ffio_get_checksum(VAR_0->pb) ^ UINT32_MAX;

    if (crc != avio_rl32(VAR_0->pb)) {

        av_log(VAR_0, AV_LOG_ERROR, "Header CRC error\n");

        return AVERROR_INVALIDDATA;

    }



    c->frame_size      = VAR_4 * 256 / 245;

    c->last_frame_size = nb_samples % c->frame_size;

    if (!c->last_frame_size)

        c->last_frame_size = c->frame_size;

    c->totalframes = nb_samples / c->frame_size + (c->last_frame_size < c->frame_size);

    c->currentframe = 0;



    if(c->totalframes >= UINT_MAX/sizeof(uint32_t) || c->totalframes <= 0){

        av_log(VAR_0, AV_LOG_ERROR, "totalframes %d invalid\n", c->totalframes);

        return AVERROR_INVALIDDATA;

    }



    st = avformat_new_stream(VAR_0, NULL);

    if (!st)

        return AVERROR(ENOMEM);



    avpriv_set_pts_info(st, 64, 1, VAR_4);

    st->start_time = 0;

    st->duration = nb_samples;



    framepos = avio_tell(VAR_0->pb) + 4*c->totalframes + 4;



    if (ff_alloc_extradata(st->codec, avio_tell(VAR_0->pb) - start_offset))

        return AVERROR(ENOMEM);



    avio_seek(VAR_0->pb, start_offset, SEEK_SET);

    avio_read(VAR_0->pb, st->codec->extradata, st->codec->extradata_size);



    ffio_init_checksum(VAR_0->pb, tta_check_crc, UINT32_MAX);

    for (VAR_1 = 0; VAR_1 < c->totalframes; VAR_1++) {

        uint32_t size = avio_rl32(VAR_0->pb);

        av_add_index_entry(st, framepos, VAR_1 * c->frame_size, size, 0,

                           AVINDEX_KEYFRAME);

        framepos += size;

    }

    crc = ffio_get_checksum(VAR_0->pb) ^ UINT32_MAX;

    if (crc != avio_rl32(VAR_0->pb)) {

        av_log(VAR_0, AV_LOG_ERROR, "Seek table CRC error\n");

        return AVERROR_INVALIDDATA;

    }



    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;

    st->codec->codec_id = AV_CODEC_ID_TTA;

    st->codec->VAR_2 = VAR_2;

    st->codec->sample_rate = VAR_4;

    st->codec->bits_per_coded_sample = VAR_3;



    if (VAR_0->pb->seekable) {

        int64_t pos = avio_tell(VAR_0->pb);

        ff_ape_parse_tag(VAR_0);

        avio_seek(VAR_0->pb, pos, SEEK_SET);

    }



    return 0;

}

static int FUNC_0(AVFormatContext *VAR_0)
{ TTAContext *c = VAR_0->priv_data; AVStream *st; int VAR_1, VAR_2, VAR_3, VAR_4; uint64_t framepos, start_offset; uint32_t nb_samples, crc; ff_id3v1_read(VAR_0); start_offset = avio_tell(VAR_0->pb); ffio_init_checksum(VAR_0->pb, tta_check_crc, UINT32_MAX); if (avio_rl32(VAR_0->pb) != AV_RL32("TTA1"))
return AVERROR_INVALIDDATA; avio_skip(VAR_0->pb, 2); VAR_2 = avio_rl16(VAR_0->pb); VAR_3 = avio_rl16(VAR_0->pb); VAR_4 = avio_rl32(VAR_0->pb); if(VAR_4 <= 0 || VAR_4 > 1000000){ av_log(VAR_0, AV_LOG_ERROR, "nonsense VAR_4\n"); return AVERROR_INVALIDDATA; } nb_samples = avio_rl32(VAR_0->pb); if (!nb_samples) { av_log(VAR_0, AV_LOG_ERROR, "invalid number of samples\n"); return AVERROR_INVALIDDATA; } crc = ffio_get_checksum(VAR_0->pb) ^ UINT32_MAX; if (crc != avio_rl32(VAR_0->pb)) { av_log(VAR_0, AV_LOG_ERROR, "Header CRC error\n"); return AVERROR_INVALIDDATA; } c->frame_size      = VAR_4 * 256 / 245; c->last_frame_size = nb_samples % c->frame_size; if (!c->last_frame_size)
c->last_frame_size = c->frame_size; c->totalframes = nb_samples / c->frame_size + (c->last_frame_size < c->frame_size); c->currentframe = 0; if(c->totalframes >= UINT_MAX/sizeof(uint32_t) || c->totalframes <= 0){ av_log(VAR_0, AV_LOG_ERROR, "totalframes %d invalid\n", c->totalframes); return AVERROR_INVALIDDATA; } st = avformat_new_stream(VAR_0, NULL); if (!st)
return AVERROR(ENOMEM); avpriv_set_pts_info(st, 64, 1, VAR_4); st->start_time = 0; st->duration = nb_samples; framepos = avio_tell(VAR_0->pb) + 4*c->totalframes + 4; if (ff_alloc_extradata(st->codec, avio_tell(VAR_0->pb) - start_offset))
return AVERROR(ENOMEM); avio_seek(VAR_0->pb, start_offset, SEEK_SET); avio_read(VAR_0->pb, st->codec->extradata, st->codec->extradata_size); ffio_init_checksum(VAR_0->pb, tta_check_crc, UINT32_MAX); for (VAR_1 = 0; VAR_1 < c->totalframes; VAR_1++) { uint32_t size = avio_rl32(VAR_0->pb); av_add_index_entry(st, framepos, VAR_1 * c->frame_size, size, 0,
AVINDEX_KEYFRAME); framepos += size; } crc = ffio_get_checksum(VAR_0->pb) ^ UINT32_MAX; if (crc != avio_rl32(VAR_0->pb)) { av_log(VAR_0, AV_LOG_ERROR, "Seek table CRC error\n"); return AVERROR_INVALIDDATA; } st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = AV_CODEC_ID_TTA; st->codec->VAR_2 = VAR_2; st->codec->sample_rate = VAR_4; st->codec->bits_per_coded_sample = VAR_3; if (VAR_0->pb->seekable) { int64_t pos = avio_tell(VAR_0->pb); ff_ape_parse_tag(VAR_0); avio_seek(VAR_0->pb, pos, SEEK_SET); } return 0; }