static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream *vstream, int64_t max_pos) {

    unsigned int timeslen = 0, fileposlen = 0, i;

    char str_val[256];

    int64_t *times = NULL;

    int64_t *filepositions = NULL;

    int ret = AVERROR(ENOSYS);

    int64_t initial_pos = avio_tell(ioc);

    AVDictionaryEntry *creator = av_dict_get(s->metadata, "metadatacreator",

                                             NULL, 0);



    if (creator && !strcmp(creator->value, "MEGA")) {

        /* Files with this metadatacreator tag seem to have filepositions

         * pointing at the 4 trailer bytes of the previous packet,

         * which isn't the norm (nor what we expect here, nor what

         * jwplayer + lighttpd expect, nor what flvtool2 produces).

         * Just ignore the index in this case, instead of risking trying

         * to adjust it to something that might or might not work. */

        return 0;

    }



    if(vstream->nb_index_entries>0){

        av_log(s, AV_LOG_WARNING, "Skiping duplicate index\n");

        return 0;

    }



    while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {

        int64_t** current_array;

        unsigned int arraylen;



        // Expect array object in context

        if (avio_r8(ioc) != AMF_DATA_TYPE_ARRAY)

            break;



        arraylen = avio_rb32(ioc);

        if(arraylen>>28)

            break;



        if       (!strcmp(KEYFRAMES_TIMESTAMP_TAG , str_val) && !times){

            current_array= &times;

            timeslen= arraylen;

        }else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && !filepositions){

            current_array= &filepositions;

            fileposlen= arraylen;

        }else // unexpected metatag inside keyframes, will not use such metadata for indexing

            break;



        if (!(*current_array = av_mallocz(sizeof(**current_array) * arraylen))) {

            ret = AVERROR(ENOMEM);

            goto finish;

        }



        for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) {

            if (avio_r8(ioc) != AMF_DATA_TYPE_NUMBER)

                goto finish;

            current_array[0][i] = av_int2dbl(avio_rb64(ioc));

        }

        if (times && filepositions) {

            // All done, exiting at a position allowing amf_parse_object

            // to finish parsing the object

            ret = 0;

            break;

        }

    }



    if (timeslen == fileposlen) {

         for(i = 0; i < timeslen; i++)

             av_add_index_entry(vstream, filepositions[i], times[i]*1000, 0, 0, AVINDEX_KEYFRAME);

    } else

        av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");



finish:

    av_freep(&times);

    av_freep(&filepositions);

    avio_seek(ioc, initial_pos, SEEK_SET);

    return ret;

}

static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream *vstream, int64_t max_pos) {

    unsigned int timeslen = 0, fileposlen = 0, i;

    char str_val[256];

    int64_t *times = NULL;

    int64_t *filepositions = NULL;

    int ret = AVERROR(ENOSYS);

    int64_t initial_pos = avio_tell(ioc);

    AVDictionaryEntry *creator = av_dict_get(s->metadata, "metadatacreator",

                                             NULL, 0);



    if (creator && !strcmp(creator->value, "MEGA")) {

        











        return 0;

    }



    if(vstream->nb_index_entries>0){

        av_log(s, AV_LOG_WARNING, "Skiping duplicate index\n");

        return 0;

    }



    while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {

        int64_t** current_array;

        unsigned int arraylen;



        

        if (avio_r8(ioc) != AMF_DATA_TYPE_ARRAY)

            break;



        arraylen = avio_rb32(ioc);

        if(arraylen>>28)

            break;



        if       (!strcmp(KEYFRAMES_TIMESTAMP_TAG , str_val) && !times){

            current_array= &times;

            timeslen= arraylen;

        }else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && !filepositions){

            current_array= &filepositions;

            fileposlen= arraylen;

        }else 

            break;



        if (!(*current_array = av_mallocz(sizeof(**current_array) * arraylen))) {

            ret = AVERROR(ENOMEM);

            goto finish;

        }



        for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) {

            if (avio_r8(ioc) != AMF_DATA_TYPE_NUMBER)

                goto finish;

            current_array[0][i] = av_int2dbl(avio_rb64(ioc));

        }

        if (times && filepositions) {

            

            

            ret = 0;

            break;

        }

    }



    if (timeslen == fileposlen) {

         for(i = 0; i < timeslen; i++)

             av_add_index_entry(vstream, filepositions[i], times[i]*1000, 0, 0, AVINDEX_KEYFRAME);

    } else

        av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");



finish:

    av_freep(&times);

    av_freep(&filepositions);

    avio_seek(ioc, initial_pos, SEEK_SET);

    return ret;

}

static int FUNC_0(AVFormatContext *VAR_0, AVIOContext *VAR_1, AVStream *VAR_2, int64_t VAR_3) {

    unsigned int VAR_4 = 0, VAR_5 = 0, VAR_6;

    char VAR_7[256];

    int64_t *times = NULL;

    int64_t *filepositions = NULL;

    int VAR_8 = AVERROR(ENOSYS);

    int64_t initial_pos = avio_tell(VAR_1);

    AVDictionaryEntry *creator = av_dict_get(VAR_0->metadata, "metadatacreator",

                                             NULL, 0);



    if (creator && !strcmp(creator->value, "MEGA")) {

        











        return 0;

    }



    if(VAR_2->nb_index_entries>0){

        av_log(VAR_0, AV_LOG_WARNING, "Skiping duplicate index\n");

        return 0;

    }



    while (avio_tell(VAR_1) < VAR_3 - 2 && amf_get_string(VAR_1, VAR_7, sizeof(VAR_7)) > 0) {

        int64_t** current_array;

        unsigned int VAR_9;



        

        if (avio_r8(VAR_1) != AMF_DATA_TYPE_ARRAY)

            break;



        VAR_9 = avio_rb32(VAR_1);

        if(VAR_9>>28)

            break;



        if       (!strcmp(KEYFRAMES_TIMESTAMP_TAG , VAR_7) && !times){

            current_array= &times;

            VAR_4= VAR_9;

        }else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, VAR_7) && !filepositions){

            current_array= &filepositions;

            VAR_5= VAR_9;

        }else 

            break;



        if (!(*current_array = av_mallocz(sizeof(**current_array) * VAR_9))) {

            VAR_8 = AVERROR(ENOMEM);

            goto finish;

        }



        for (VAR_6 = 0; VAR_6 < VAR_9 && avio_tell(VAR_1) < VAR_3 - 1; VAR_6++) {

            if (avio_r8(VAR_1) != AMF_DATA_TYPE_NUMBER)

                goto finish;

            current_array[0][VAR_6] = av_int2dbl(avio_rb64(VAR_1));

        }

        if (times && filepositions) {

            

            

            VAR_8 = 0;

            break;

        }

    }



    if (VAR_4 == VAR_5) {

         for(VAR_6 = 0; VAR_6 < VAR_4; VAR_6++)

             av_add_index_entry(VAR_2, filepositions[VAR_6], times[VAR_6]*1000, 0, 0, AVINDEX_KEYFRAME);

    } else

        av_log(VAR_0, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");



finish:

    av_freep(&times);

    av_freep(&filepositions);

    avio_seek(VAR_1, initial_pos, SEEK_SET);

    return VAR_8;

}

static int FUNC_0(AVFormatContext *VAR_0, AVIOContext *VAR_1, AVStream *VAR_2, int64_t VAR_3) { unsigned int VAR_4 = 0, VAR_5 = 0, VAR_6; char VAR_7[256]; int64_t *times = NULL; int64_t *filepositions = NULL; int VAR_8 = AVERROR(ENOSYS); int64_t initial_pos = avio_tell(VAR_1); AVDictionaryEntry *creator = av_dict_get(VAR_0->metadata, "metadatacreator",
NULL, 0); if (creator && !strcmp(creator->value, "MEGA")) { return 0; } if(VAR_2->nb_index_entries>0){ av_log(VAR_0, AV_LOG_WARNING, "Skiping duplicate index\n"); return 0; } while (avio_tell(VAR_1) < VAR_3 - 2 && amf_get_string(VAR_1, VAR_7, sizeof(VAR_7)) > 0) { int64_t** current_array; unsigned int VAR_9; if (avio_r8(VAR_1) != AMF_DATA_TYPE_ARRAY)
break; VAR_9 = avio_rb32(VAR_1); if(VAR_9>>28)
break; if       (!strcmp(KEYFRAMES_TIMESTAMP_TAG , VAR_7) && !times){ current_array= &times; VAR_4= VAR_9; }else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, VAR_7) && !filepositions){ current_array= &filepositions; VAR_5= VAR_9; }else break; if (!(*current_array = av_mallocz(sizeof(**current_array) * VAR_9))) { VAR_8 = AVERROR(ENOMEM); goto finish; } for (VAR_6 = 0; VAR_6 < VAR_9 && avio_tell(VAR_1) < VAR_3 - 1; VAR_6++) { if (avio_r8(VAR_1) != AMF_DATA_TYPE_NUMBER)
goto finish; current_array[0][VAR_6] = av_int2dbl(avio_rb64(VAR_1)); } if (times && filepositions) { VAR_8 = 0; break; } } if (VAR_4 == VAR_5) { for(VAR_6 = 0; VAR_6 < VAR_4; VAR_6++) av_add_index_entry(VAR_2, filepositions[VAR_6], times[VAR_6]*1000, 0, 0, AVINDEX_KEYFRAME); } else av_log(VAR_0, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n"); finish:
av_freep(&times); av_freep(&filepositions); avio_seek(VAR_1, initial_pos, SEEK_SET); return VAR_8; }