static int exif_decode_tag(void *logctx, GetByteContext *gbytes, int le,

                           int depth, AVDictionary **metadata)

{

    int ret, cur_pos;

    unsigned id, count;

    enum TiffTypes type;



    if (depth > 2) {

        return 0;

    }



    ff_tread_tag(gbytes, le, &id, &type, &count, &cur_pos);



    if (!bytestream2_tell(gbytes)) {

        bytestream2_seek(gbytes, cur_pos, SEEK_SET);

        return 0;

    }



    // read count values and add it metadata

    // store metadata or proceed with next IFD

    ret = ff_tis_ifd(id);

    if (ret) {

        ret = avpriv_exif_decode_ifd(logctx, gbytes, le, depth + 1, metadata);

    } else {

        const char *name = exif_get_tag_name(id);

        char *use_name   = (char*) name;



        if (!use_name) {

            use_name = av_malloc(7);

            if (!use_name) {

                return AVERROR(ENOMEM);

            }

            snprintf(use_name, 7, "0x%04X", id);

        }



        ret = exif_add_metadata(logctx, count, type, use_name, NULL,

                                gbytes, le, metadata);



        if (!name) {

            av_freep(&use_name);

        }

    }



    bytestream2_seek(gbytes, cur_pos, SEEK_SET);



    return ret;

}

static int exif_decode_tag(void *logctx, GetByteContext *gbytes, int le,

                           int depth, AVDictionary **metadata)

{

    int ret, cur_pos;

    unsigned id, count;

    enum TiffTypes type;



    if (depth > 2) {

        return 0;

    }



    ff_tread_tag(gbytes, le, &id, &type, &count, &cur_pos);



    if (!bytestream2_tell(gbytes)) {

        bytestream2_seek(gbytes, cur_pos, SEEK_SET);

        return 0;

    }



    

    

    ret = ff_tis_ifd(id);

    if (ret) {

        ret = avpriv_exif_decode_ifd(logctx, gbytes, le, depth + 1, metadata);

    } else {

        const char *name = exif_get_tag_name(id);

        char *use_name   = (char*) name;



        if (!use_name) {

            use_name = av_malloc(7);

            if (!use_name) {

                return AVERROR(ENOMEM);

            }

            snprintf(use_name, 7, "0x%04X", id);

        }



        ret = exif_add_metadata(logctx, count, type, use_name, NULL,

                                gbytes, le, metadata);



        if (!name) {

            av_freep(&use_name);

        }

    }



    bytestream2_seek(gbytes, cur_pos, SEEK_SET);



    return ret;

}

static int FUNC_0(void *VAR_0, GetByteContext *VAR_1, int VAR_2,

                           int VAR_3, AVDictionary **VAR_4)

{

    int VAR_5, VAR_6;

    unsigned VAR_7, VAR_8;

    enum TiffTypes VAR_9;



    if (VAR_3 > 2) {

        return 0;

    }



    ff_tread_tag(VAR_1, VAR_2, &VAR_7, &VAR_9, &VAR_8, &VAR_6);



    if (!bytestream2_tell(VAR_1)) {

        bytestream2_seek(VAR_1, VAR_6, SEEK_SET);

        return 0;

    }



    

    

    VAR_5 = ff_tis_ifd(VAR_7);

    if (VAR_5) {

        VAR_5 = avpriv_exif_decode_ifd(VAR_0, VAR_1, VAR_2, VAR_3 + 1, VAR_4);

    } else {

        const char *VAR_10 = exif_get_tag_name(VAR_7);

        char *VAR_11   = (char*) VAR_10;



        if (!VAR_11) {

            VAR_11 = av_malloc(7);

            if (!VAR_11) {

                return AVERROR(ENOMEM);

            }

            snprintf(VAR_11, 7, "0x%04X", VAR_7);

        }



        VAR_5 = exif_add_metadata(VAR_0, VAR_8, VAR_9, VAR_11, NULL,

                                VAR_1, VAR_2, VAR_4);



        if (!VAR_10) {

            av_freep(&VAR_11);

        }

    }



    bytestream2_seek(VAR_1, VAR_6, SEEK_SET);



    return VAR_5;

}

static int FUNC_0(void *VAR_0, GetByteContext *VAR_1, int VAR_2,
int VAR_3, AVDictionary **VAR_4)
{ int VAR_5, VAR_6; unsigned VAR_7, VAR_8; enum TiffTypes VAR_9; if (VAR_3 > 2) { return 0; } ff_tread_tag(VAR_1, VAR_2, &VAR_7, &VAR_9, &VAR_8, &VAR_6); if (!bytestream2_tell(VAR_1)) { bytestream2_seek(VAR_1, VAR_6, SEEK_SET); return 0; } VAR_5 = ff_tis_ifd(VAR_7); if (VAR_5) { VAR_5 = avpriv_exif_decode_ifd(VAR_0, VAR_1, VAR_2, VAR_3 + 1, VAR_4); } else { const char *VAR_10 = exif_get_tag_name(VAR_7); char *VAR_11   = (char*) VAR_10; if (!VAR_11) { VAR_11 = av_malloc(7); if (!VAR_11) { return AVERROR(ENOMEM); } snprintf(VAR_11, 7, "0x%04X", VAR_7); } VAR_5 = exif_add_metadata(VAR_0, VAR_8, VAR_9, VAR_11, NULL,
VAR_1, VAR_2, VAR_4); if (!VAR_10) { av_freep(&VAR_11); } } bytestream2_seek(VAR_1, VAR_6, SEEK_SET); return VAR_5; }