static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
{
    NSVContext *nsv = s->priv_data;
    AVIOContext *pb = s->pb;
    unsigned int av_unused file_size;
    unsigned int size;
    int64_t duration;
    int strings_size;
    int table_entries;
    int table_entries_used;
    av_dlog(s, "%s()\n", __FUNCTION__);
    nsv->state = NSV_UNSYNC;
    size = avio_rl32(pb);
    if (size < 28)
        return -1;
    nsv->NSVf_end = size;
    file_size = (uint32_t)avio_rl32(pb);
    av_dlog(s, "NSV NSVf chunk_size %u\n", size);
    av_dlog(s, "NSV NSVf file_size %u\n", file_size);
    nsv->duration = duration = avio_rl32(pb);
    av_dlog(s, "NSV NSVf duration %"PRId64" ms\n", duration);
    strings_size = avio_rl32(pb);
    table_entries = avio_rl32(pb);
    table_entries_used = avio_rl32(pb);
    av_dlog(s, "NSV NSVf info-strings size: %d, table entries: %d, bis %d\n",
            strings_size, table_entries, table_entries_used);
    if (pb->eof_reached)
        return -1;
    av_dlog(s, "NSV got header; filepos %"PRId64"\n", avio_tell(pb));
    if (strings_size > 0) {
        char *strings;
        char *p, *endp;
        char *token, *value;
        char quote;
        p = strings = av_mallocz(strings_size + 1);
        endp = strings + strings_size;
        avio_read(pb, strings, strings_size);
        while (p < endp) {
            while (*p == ' ')
                p++;
            if (p >= endp-2)
                break;
            token = p;
            p = strchr(p, '=');
            if (!p || p >= endp-2)
                break;
            *p++ = '\0';
            quote = *p++;
            value = p;
            p = strchr(p, quote);
            if (!p || p >= endp)
                break;
            *p++ = '\0';
            av_dlog(s, "NSV NSVf INFO: %s='%s'\n", token, value);
            av_metadata_set2(&s->metadata, token, value, 0);
        }
        av_free(strings);
    }
    if (pb->eof_reached)
        return -1;
    av_dlog(s, "NSV got infos; filepos %"PRId64"\n", avio_tell(pb));
    if (table_entries_used > 0) {
        int i;
        nsv->index_entries = table_entries_used;
        if((unsigned)table_entries_used >= UINT_MAX / sizeof(uint32_t))
            return -1;
        nsv->nsvs_file_offset = av_malloc((unsigned)table_entries_used * sizeof(uint32_t));
        for(i=0;i<table_entries_used;i++)
            nsv->nsvs_file_offset[i] = avio_rl32(pb) + size;
        if(table_entries > table_entries_used &&
           avio_rl32(pb) == MKTAG('T','O','C','2')) {
            nsv->nsvs_timestamps = av_malloc((unsigned)table_entries_used*sizeof(uint32_t));
            for(i=0;i<table_entries_used;i++) {
                nsv->nsvs_timestamps[i] = avio_rl32(pb);
            }
        }
    }
    av_dlog(s, "NSV got index; filepos %"PRId64"\n", avio_tell(pb));
#ifdef DEBUG_DUMP_INDEX
#define V(v) ((v<0x20 || v > 127)?'.':v)
    av_dlog(s, "NSV %d INDEX ENTRIES:\n", table_entries);
    av_dlog(s, "NSV [dataoffset][fileoffset]\n", table_entries);
    for (i = 0; i < table_entries; i++) {
        unsigned char b[8];
        avio_seek(pb, size + nsv->nsvs_file_offset[i], SEEK_SET);
        avio_read(pb, b, 8);
        av_dlog(s, "NSV [0x%08lx][0x%08lx]: %02x %02x %02x %02x %02x %02x %02x %02x"
           "%c%c%c%c%c%c%c%c\n",
           nsv->nsvs_file_offset[i], size + nsv->nsvs_file_offset[i],
           b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7],
           V(b[0]), V(b[1]), V(b[2]), V(b[3]), V(b[4]), V(b[5]), V(b[6]), V(b[7]) );
    }
#undef V
#endif
    avio_seek(pb, nsv->base_offset + size, SEEK_SET);
    if (pb->eof_reached)
        return -1;
    nsv->state = NSV_HAS_READ_NSVF;
    return 0;
}
['static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)\n{\n    NSVContext *nsv = s->priv_data;\n    AVIOContext *pb = s->pb;\n    unsigned int av_unused file_size;\n    unsigned int size;\n    int64_t duration;\n    int strings_size;\n    int table_entries;\n    int table_entries_used;\n    av_dlog(s, "%s()\\n", __FUNCTION__);\n    nsv->state = NSV_UNSYNC;\n    size = avio_rl32(pb);\n    if (size < 28)\n        return -1;\n    nsv->NSVf_end = size;\n    file_size = (uint32_t)avio_rl32(pb);\n    av_dlog(s, "NSV NSVf chunk_size %u\\n", size);\n    av_dlog(s, "NSV NSVf file_size %u\\n", file_size);\n    nsv->duration = duration = avio_rl32(pb);\n    av_dlog(s, "NSV NSVf duration %"PRId64" ms\\n", duration);\n    strings_size = avio_rl32(pb);\n    table_entries = avio_rl32(pb);\n    table_entries_used = avio_rl32(pb);\n    av_dlog(s, "NSV NSVf info-strings size: %d, table entries: %d, bis %d\\n",\n            strings_size, table_entries, table_entries_used);\n    if (pb->eof_reached)\n        return -1;\n    av_dlog(s, "NSV got header; filepos %"PRId64"\\n", avio_tell(pb));\n    if (strings_size > 0) {\n        char *strings;\n        char *p, *endp;\n        char *token, *value;\n        char quote;\n        p = strings = av_mallocz(strings_size + 1);\n        endp = strings + strings_size;\n        avio_read(pb, strings, strings_size);\n        while (p < endp) {\n            while (*p == \' \')\n                p++;\n            if (p >= endp-2)\n                break;\n            token = p;\n            p = strchr(p, \'=\');\n            if (!p || p >= endp-2)\n                break;\n            *p++ = \'\\0\';\n            quote = *p++;\n            value = p;\n            p = strchr(p, quote);\n            if (!p || p >= endp)\n                break;\n            *p++ = \'\\0\';\n            av_dlog(s, "NSV NSVf INFO: %s=\'%s\'\\n", token, value);\n            av_metadata_set2(&s->metadata, token, value, 0);\n        }\n        av_free(strings);\n    }\n    if (pb->eof_reached)\n        return -1;\n    av_dlog(s, "NSV got infos; filepos %"PRId64"\\n", avio_tell(pb));\n    if (table_entries_used > 0) {\n        int i;\n        nsv->index_entries = table_entries_used;\n        if((unsigned)table_entries_used >= UINT_MAX / sizeof(uint32_t))\n            return -1;\n        nsv->nsvs_file_offset = av_malloc((unsigned)table_entries_used * sizeof(uint32_t));\n        for(i=0;i<table_entries_used;i++)\n            nsv->nsvs_file_offset[i] = avio_rl32(pb) + size;\n        if(table_entries > table_entries_used &&\n           avio_rl32(pb) == MKTAG(\'T\',\'O\',\'C\',\'2\')) {\n            nsv->nsvs_timestamps = av_malloc((unsigned)table_entries_used*sizeof(uint32_t));\n            for(i=0;i<table_entries_used;i++) {\n                nsv->nsvs_timestamps[i] = avio_rl32(pb);\n            }\n        }\n    }\n    av_dlog(s, "NSV got index; filepos %"PRId64"\\n", avio_tell(pb));\n#ifdef DEBUG_DUMP_INDEX\n#define V(v) ((v<0x20 || v > 127)?\'.\':v)\n    av_dlog(s, "NSV %d INDEX ENTRIES:\\n", table_entries);\n    av_dlog(s, "NSV [dataoffset][fileoffset]\\n", table_entries);\n    for (i = 0; i < table_entries; i++) {\n        unsigned char b[8];\n        avio_seek(pb, size + nsv->nsvs_file_offset[i], SEEK_SET);\n        avio_read(pb, b, 8);\n        av_dlog(s, "NSV [0x%08lx][0x%08lx]: %02x %02x %02x %02x %02x %02x %02x %02x"\n           "%c%c%c%c%c%c%c%c\\n",\n           nsv->nsvs_file_offset[i], size + nsv->nsvs_file_offset[i],\n           b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7],\n           V(b[0]), V(b[1]), V(b[2]), V(b[3]), V(b[4]), V(b[5]), V(b[6]), V(b[7]) );\n    }\n#undef V\n#endif\n    avio_seek(pb, nsv->base_offset + size, SEEK_SET);\n    if (pb->eof_reached)\n        return -1;\n    nsv->state = NSV_HAS_READ_NSVF;\n    return 0;\n}', 'unsigned int avio_rl32(AVIOContext *s)\n{\n    unsigned int val;\n    val = avio_rl16(s);\n    val |= avio_rl16(s) << 16;\n    return val;\n}', 'unsigned int avio_rl16(AVIOContext *s)\n{\n    unsigned int val;\n    val = avio_r8(s);\n    val |= avio_r8(s) << 8;\n    return val;\n}', 'int avio_r8(AVIOContext *s)\n{\n    if (s->buf_ptr >= s->buf_end)\n        fill_buffer(s);\n    if (s->buf_ptr < s->buf_end)\n        return *s->buf_ptr++;\n    return 0;\n}', 'void *av_malloc(size_t size)\n{\n    void *ptr = NULL;\n#if CONFIG_MEMALIGN_HACK\n    long diff;\n#endif\n    if(size > (INT_MAX-32) )\n        return NULL;\n#if CONFIG_MEMALIGN_HACK\n    ptr = malloc(size+32);\n    if(!ptr)\n        return ptr;\n    diff= ((-(long)ptr - 1)&31) + 1;\n    ptr = (char*)ptr + diff;\n    ((char*)ptr)[-1]= diff;\n#elif HAVE_POSIX_MEMALIGN\n    if (posix_memalign(&ptr,32,size))\n        ptr = NULL;\n#elif HAVE_MEMALIGN\n    ptr = memalign(32,size);\n#else\n    ptr = malloc(size);\n#endif\n    return ptr;\n}']