int ff_flac_parse_picture(AVFormatContext *s, uint8_t *buf, int buf_size)

{

    const CodecMime *mime = ff_id3v2_mime_tags;

    enum AVCodecID id = AV_CODEC_ID_NONE;

    AVBufferRef *data = NULL;

    uint8_t mimetype[64], *desc = NULL;

    AVIOContext *pb = NULL;

    AVStream *st;

    int type, width, height;

    int len, ret = 0;



    pb = avio_alloc_context(buf, buf_size, 0, NULL, NULL, NULL, NULL);

    if (!pb)

        return AVERROR(ENOMEM);



    /* read the picture type */

    type = avio_rb32(pb);

    if (type >= FF_ARRAY_ELEMS(ff_id3v2_picture_types) || type < 0) {

        av_log(s, AV_LOG_ERROR, "Invalid picture type: %d.\n", type);

        if (s->error_recognition & AV_EF_EXPLODE) {

            ret = AVERROR_INVALIDDATA;

            goto fail;

        }

        type = 0;

    }



    /* picture mimetype */

    len = avio_rb32(pb);

    if (len <= 0 ||

        avio_read(pb, mimetype, FFMIN(len, sizeof(mimetype) - 1)) != len) {

        av_log(s, AV_LOG_ERROR, "Could not read mimetype from an attached "

               "picture.\n");

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR_INVALIDDATA;

        goto fail;

    }

    mimetype[len] = 0;



    while (mime->id != AV_CODEC_ID_NONE) {

        if (!strncmp(mime->str, mimetype, sizeof(mimetype))) {

            id = mime->id;

            break;

        }

        mime++;

    }

    if (id == AV_CODEC_ID_NONE) {

        av_log(s, AV_LOG_ERROR, "Unknown attached picture mimetype: %s.\n",

               mimetype);

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR_INVALIDDATA;

        goto fail;

    }



    /* picture description */

    len = avio_rb32(pb);

    if (len > 0) {

        if (!(desc = av_malloc(len + 1))) {

            ret = AVERROR(ENOMEM);

            goto fail;

        }



        if (avio_read(pb, desc, len) != len) {

            av_log(s, AV_LOG_ERROR, "Error reading attached picture description.\n");

            if (s->error_recognition & AV_EF_EXPLODE)

                ret = AVERROR(EIO);

            goto fail;

        }

        desc[len] = 0;

    }



    /* picture metadata */

    width  = avio_rb32(pb);

    height = avio_rb32(pb);

    avio_skip(pb, 8);



    /* picture data */

    len = avio_rb32(pb);

    if (len <= 0) {

        av_log(s, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", len);

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR_INVALIDDATA;

        goto fail;

    }

    if (!(data = av_buffer_alloc(len))) {

        ret = AVERROR(ENOMEM);

        goto fail;

    }

    if (avio_read(pb, data->data, len) != len) {

        av_log(s, AV_LOG_ERROR, "Error reading attached picture data.\n");

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR(EIO);

        goto fail;

    }



    st = avformat_new_stream(s, NULL);

    if (!st) {

        ret = AVERROR(ENOMEM);

        goto fail;

    }



    av_init_packet(&st->attached_pic);

    st->attached_pic.buf          = data;

    st->attached_pic.data         = data->data;

    st->attached_pic.size         = len;

    st->attached_pic.stream_index = st->index;

    st->attached_pic.flags       |= AV_PKT_FLAG_KEY;



    st->disposition      |= AV_DISPOSITION_ATTACHED_PIC;

    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;

    st->codec->codec_id   = id;

    st->codec->width      = width;

    st->codec->height     = height;

    av_dict_set(&st->metadata, "comment", ff_id3v2_picture_types[type], 0);

    if (desc)

        av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL);



    av_freep(&pb);



    return 0;



fail:

    av_buffer_unref(&data);

    av_freep(&desc);

    av_freep(&pb);



    return ret;

}

int ff_flac_parse_picture(AVFormatContext *s, uint8_t *buf, int buf_size)

{

    const CodecMime *mime = ff_id3v2_mime_tags;

    enum AVCodecID id = AV_CODEC_ID_NONE;

    AVBufferRef *data = NULL;

    uint8_t mimetype[64], *desc = NULL;

    AVIOContext *pb = NULL;

    AVStream *st;

    int type, width, height;

    int len, ret = 0;



    pb = avio_alloc_context(buf, buf_size, 0, NULL, NULL, NULL, NULL);

    if (!pb)

        return AVERROR(ENOMEM);



    

    type = avio_rb32(pb);

    if (type >= FF_ARRAY_ELEMS(ff_id3v2_picture_types) || type < 0) {

        av_log(s, AV_LOG_ERROR, "Invalid picture type: %d.\n", type);

        if (s->error_recognition & AV_EF_EXPLODE) {

            ret = AVERROR_INVALIDDATA;

            goto fail;

        }

        type = 0;

    }



    

    len = avio_rb32(pb);

    if (len <= 0 ||

        avio_read(pb, mimetype, FFMIN(len, sizeof(mimetype) - 1)) != len) {

        av_log(s, AV_LOG_ERROR, "Could not read mimetype from an attached "

               "picture.\n");

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR_INVALIDDATA;

        goto fail;

    }

    mimetype[len] = 0;



    while (mime->id != AV_CODEC_ID_NONE) {

        if (!strncmp(mime->str, mimetype, sizeof(mimetype))) {

            id = mime->id;

            break;

        }

        mime++;

    }

    if (id == AV_CODEC_ID_NONE) {

        av_log(s, AV_LOG_ERROR, "Unknown attached picture mimetype: %s.\n",

               mimetype);

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR_INVALIDDATA;

        goto fail;

    }



    

    len = avio_rb32(pb);

    if (len > 0) {

        if (!(desc = av_malloc(len + 1))) {

            ret = AVERROR(ENOMEM);

            goto fail;

        }



        if (avio_read(pb, desc, len) != len) {

            av_log(s, AV_LOG_ERROR, "Error reading attached picture description.\n");

            if (s->error_recognition & AV_EF_EXPLODE)

                ret = AVERROR(EIO);

            goto fail;

        }

        desc[len] = 0;

    }



    

    width  = avio_rb32(pb);

    height = avio_rb32(pb);

    avio_skip(pb, 8);



    

    len = avio_rb32(pb);

    if (len <= 0) {

        av_log(s, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", len);

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR_INVALIDDATA;

        goto fail;

    }

    if (!(data = av_buffer_alloc(len))) {

        ret = AVERROR(ENOMEM);

        goto fail;

    }

    if (avio_read(pb, data->data, len) != len) {

        av_log(s, AV_LOG_ERROR, "Error reading attached picture data.\n");

        if (s->error_recognition & AV_EF_EXPLODE)

            ret = AVERROR(EIO);

        goto fail;

    }



    st = avformat_new_stream(s, NULL);

    if (!st) {

        ret = AVERROR(ENOMEM);

        goto fail;

    }



    av_init_packet(&st->attached_pic);

    st->attached_pic.buf          = data;

    st->attached_pic.data         = data->data;

    st->attached_pic.size         = len;

    st->attached_pic.stream_index = st->index;

    st->attached_pic.flags       |= AV_PKT_FLAG_KEY;



    st->disposition      |= AV_DISPOSITION_ATTACHED_PIC;

    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;

    st->codec->codec_id   = id;

    st->codec->width      = width;

    st->codec->height     = height;

    av_dict_set(&st->metadata, "comment", ff_id3v2_picture_types[type], 0);

    if (desc)

        av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL);



    av_freep(&pb);



    return 0;



fail:

    av_buffer_unref(&data);

    av_freep(&desc);

    av_freep(&pb);



    return ret;

}

    int type, width, height;     int len, ret = 0;     if (type >= FF_ARRAY_ELEMS(ff_id3v2_picture_types) || type < 0) {     if (len <= 0 ||     if (len <= 0) {
int FUNC_0(AVFormatContext *VAR_0, uint8_t *VAR_1, int VAR_2)

{

    const CodecMime *VAR_3 = ff_id3v2_mime_tags;

    enum AVCodecID VAR_4 = AV_CODEC_ID_NONE;

    AVBufferRef *data = NULL;

    uint8_t mimetype[64], *desc = NULL;

    AVIOContext *pb = NULL;

    AVStream *st;

    int VAR_5, VAR_6, VAR_7;

    int VAR_8, VAR_9 = 0;



    pb = avio_alloc_context(VAR_1, VAR_2, 0, NULL, NULL, NULL, NULL);

    if (!pb)

        return AVERROR(ENOMEM);



    

    VAR_5 = avio_rb32(pb);

    if (VAR_5 >= FF_ARRAY_ELEMS(ff_id3v2_picture_types) || VAR_5 < 0) {

        av_log(VAR_0, AV_LOG_ERROR, "Invalid picture VAR_5: %d.\n", VAR_5);

        if (VAR_0->error_recognition & AV_EF_EXPLODE) {

            VAR_9 = AVERROR_INVALIDDATA;

            goto fail;

        }

        VAR_5 = 0;

    }



    

    VAR_8 = avio_rb32(pb);

    if (VAR_8 <= 0 ||

        avio_read(pb, mimetype, FFMIN(VAR_8, sizeof(mimetype) - 1)) != VAR_8) {

        av_log(VAR_0, AV_LOG_ERROR, "Could not read mimetype from an attached "

               "picture.\n");

        if (VAR_0->error_recognition & AV_EF_EXPLODE)

            VAR_9 = AVERROR_INVALIDDATA;

        goto fail;

    }

    mimetype[VAR_8] = 0;



    while (VAR_3->VAR_4 != AV_CODEC_ID_NONE) {

        if (!strncmp(VAR_3->str, mimetype, sizeof(mimetype))) {

            VAR_4 = VAR_3->VAR_4;

            break;

        }

        VAR_3++;

    }

    if (VAR_4 == AV_CODEC_ID_NONE) {

        av_log(VAR_0, AV_LOG_ERROR, "Unknown attached picture mimetype: %VAR_0.\n",

               mimetype);

        if (VAR_0->error_recognition & AV_EF_EXPLODE)

            VAR_9 = AVERROR_INVALIDDATA;

        goto fail;

    }



    

    VAR_8 = avio_rb32(pb);

    if (VAR_8 > 0) {

        if (!(desc = av_malloc(VAR_8 + 1))) {

            VAR_9 = AVERROR(ENOMEM);

            goto fail;

        }



        if (avio_read(pb, desc, VAR_8) != VAR_8) {

            av_log(VAR_0, AV_LOG_ERROR, "Error reading attached picture description.\n");

            if (VAR_0->error_recognition & AV_EF_EXPLODE)

                VAR_9 = AVERROR(EIO);

            goto fail;

        }

        desc[VAR_8] = 0;

    }



    

    VAR_6  = avio_rb32(pb);

    VAR_7 = avio_rb32(pb);

    avio_skip(pb, 8);



    

    VAR_8 = avio_rb32(pb);

    if (VAR_8 <= 0) {

        av_log(VAR_0, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", VAR_8);

        if (VAR_0->error_recognition & AV_EF_EXPLODE)

            VAR_9 = AVERROR_INVALIDDATA;

        goto fail;

    }

    if (!(data = av_buffer_alloc(VAR_8))) {

        VAR_9 = AVERROR(ENOMEM);

        goto fail;

    }

    if (avio_read(pb, data->data, VAR_8) != VAR_8) {

        av_log(VAR_0, AV_LOG_ERROR, "Error reading attached picture data.\n");

        if (VAR_0->error_recognition & AV_EF_EXPLODE)

            VAR_9 = AVERROR(EIO);

        goto fail;

    }



    st = avformat_new_stream(VAR_0, NULL);

    if (!st) {

        VAR_9 = AVERROR(ENOMEM);

        goto fail;

    }



    av_init_packet(&st->attached_pic);

    st->attached_pic.VAR_1          = data;

    st->attached_pic.data         = data->data;

    st->attached_pic.size         = VAR_8;

    st->attached_pic.stream_index = st->index;

    st->attached_pic.flags       |= AV_PKT_FLAG_KEY;



    st->disposition      |= AV_DISPOSITION_ATTACHED_PIC;

    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;

    st->codec->codec_id   = VAR_4;

    st->codec->VAR_6      = VAR_6;

    st->codec->VAR_7     = VAR_7;

    av_dict_set(&st->metadata, "comment", ff_id3v2_picture_types[VAR_5], 0);

    if (desc)

        av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL);



    av_freep(&pb);



    return 0;



fail:

    av_buffer_unref(&data);

    av_freep(&desc);

    av_freep(&pb);



    return VAR_9;

}

int FUNC_0(AVFormatContext *VAR_0, uint8_t *VAR_1, int VAR_2)
{ const CodecMime *VAR_3 = ff_id3v2_mime_tags; enum AVCodecID VAR_4 = AV_CODEC_ID_NONE; AVBufferRef *data = NULL; uint8_t mimetype[64], *desc = NULL; AVIOContext *pb = NULL; AVStream *st; int VAR_5, VAR_6, VAR_7; int VAR_8, VAR_9 = 0; pb = avio_alloc_context(VAR_1, VAR_2, 0, NULL, NULL, NULL, NULL); if (!pb)
return AVERROR(ENOMEM); VAR_5 = avio_rb32(pb); if (VAR_5 >= FF_ARRAY_ELEMS(ff_id3v2_picture_types) || VAR_5 < 0) { av_log(VAR_0, AV_LOG_ERROR, "Invalid picture VAR_5: %d.\n", VAR_5); if (VAR_0->error_recognition & AV_EF_EXPLODE) { VAR_9 = AVERROR_INVALIDDATA; goto fail; } VAR_5 = 0; } VAR_8 = avio_rb32(pb); if (VAR_8 <= 0 ||
avio_read(pb, mimetype, FFMIN(VAR_8, sizeof(mimetype) - 1)) != VAR_8) { av_log(VAR_0, AV_LOG_ERROR, "Could not read mimetype from an attached "
"picture.\n"); if (VAR_0->error_recognition & AV_EF_EXPLODE)
VAR_9 = AVERROR_INVALIDDATA; goto fail; } mimetype[VAR_8] = 0; while (VAR_3->VAR_4 != AV_CODEC_ID_NONE) { if (!strncmp(VAR_3->str, mimetype, sizeof(mimetype))) { VAR_4 = VAR_3->VAR_4; break; } VAR_3++; } if (VAR_4 == AV_CODEC_ID_NONE) { av_log(VAR_0, AV_LOG_ERROR, "Unknown attached picture mimetype: %VAR_0.\n",
mimetype); if (VAR_0->error_recognition & AV_EF_EXPLODE)
VAR_9 = AVERROR_INVALIDDATA; goto fail; } VAR_8 = avio_rb32(pb); if (VAR_8 > 0) { if (!(desc = av_malloc(VAR_8 + 1))) { VAR_9 = AVERROR(ENOMEM); goto fail; } if (avio_read(pb, desc, VAR_8) != VAR_8) { av_log(VAR_0, AV_LOG_ERROR, "Error reading attached picture description.\n"); if (VAR_0->error_recognition & AV_EF_EXPLODE)
VAR_9 = AVERROR(EIO); goto fail; } desc[VAR_8] = 0; } VAR_6  = avio_rb32(pb); VAR_7 = avio_rb32(pb); avio_skip(pb, 8); VAR_8 = avio_rb32(pb); if (VAR_8 <= 0) { av_log(VAR_0, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", VAR_8); if (VAR_0->error_recognition & AV_EF_EXPLODE)
VAR_9 = AVERROR_INVALIDDATA; goto fail; } if (!(data = av_buffer_alloc(VAR_8))) { VAR_9 = AVERROR(ENOMEM); goto fail; } if (avio_read(pb, data->data, VAR_8) != VAR_8) { av_log(VAR_0, AV_LOG_ERROR, "Error reading attached picture data.\n"); if (VAR_0->error_recognition & AV_EF_EXPLODE)
VAR_9 = AVERROR(EIO); goto fail; } st = avformat_new_stream(VAR_0, NULL); if (!st) { VAR_9 = AVERROR(ENOMEM); goto fail; } av_init_packet(&st->attached_pic); st->attached_pic.VAR_1          = data; st->attached_pic.data         = data->data; st->attached_pic.size         = VAR_8; st->attached_pic.stream_index = st->index; st->attached_pic.flags       |= AV_PKT_FLAG_KEY; st->disposition      |= AV_DISPOSITION_ATTACHED_PIC; st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id   = VAR_4; st->codec->VAR_6      = VAR_6; st->codec->VAR_7     = VAR_7; av_dict_set(&st->metadata, "comment", ff_id3v2_picture_types[VAR_5], 0); if (desc)
av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL); av_freep(&pb); return 0; fail:
av_buffer_unref(&data); av_freep(&desc); av_freep(&pb); return VAR_9; }