static int truemotion1_decode_header(TrueMotion1Context *s)
{
    int i;
    struct frame_header header;
    uint8_t header_buffer[128];
    const uint8_t *sel_vector_table;
    s->mb_change_bits_row_size = ((s->avctx->width >> 2) + 7) >> 3;
    header.header_size = ((s->buf[0] >> 5) | (s->buf[0] << 3)) & 0x7f;
    if (s->buf[0] < 0x10)
    {
        av_log(s->avctx, AV_LOG_ERROR, "invalid header size (%d)\n", s->buf[0]);
        return -1;
    }
    memset(header_buffer, 0, 128);
    for (i = 1; i < header.header_size; i++)
        header_buffer[i - 1] = s->buf[i] ^ s->buf[i + 1];
    header.compression = header_buffer[0];
    header.deltaset = header_buffer[1];
    header.vectable = header_buffer[2];
    header.ysize = AV_RL16(&header_buffer[3]);
    header.xsize = AV_RL16(&header_buffer[5]);
    header.checksum = AV_RL16(&header_buffer[7]);
    header.version = header_buffer[9];
    header.header_type = header_buffer[10];
    header.flags = header_buffer[11];
    header.control = header_buffer[12];
    if (header.version >= 2)
    {
        if (header.header_type > 3)
        {
            av_log(s->avctx, AV_LOG_ERROR, "invalid header type (%d)\n", header.header_type);
            return -1;
        } else if ((header.header_type == 2) || (header.header_type == 3)) {
            s->flags = header.flags;
            if (!(s->flags & FLAG_INTERFRAME))
                s->flags |= FLAG_KEYFRAME;
        } else
            s->flags = FLAG_KEYFRAME;
    } else
        s->flags = FLAG_KEYFRAME;
    if (s->flags & FLAG_SPRITE) {
        av_log(s->avctx, AV_LOG_INFO, "SPRITE frame found, please report the sample to the developers\n");
#if 0
        s->w = header.width;
        s->h = header.height;
        s->x = header.xoffset;
        s->y = header.yoffset;
#else
        return -1;
#endif
    } else {
        s->w = header.xsize;
        s->h = header.ysize;
        if (header.header_type < 2) {
            if ((s->w < 213) && (s->h >= 176))
            {
                s->flags |= FLAG_INTERPOLATED;
                av_log(s->avctx, AV_LOG_INFO, "INTERPOLATION selected, please report the sample to the developers\n");
            }
        }
    }
    if (header.compression > 17) {
        av_log(s->avctx, AV_LOG_ERROR, "invalid compression type (%d)\n", header.compression);
        return -1;
    }
    if ((header.deltaset != s->last_deltaset) ||
        (header.vectable != s->last_vectable))
        select_delta_tables(s, header.deltaset);
    if ((header.compression & 1) && header.header_type)
        sel_vector_table = pc_tbl2;
    else {
        if (header.vectable < 4)
            sel_vector_table = tables[header.vectable - 1];
        else {
            av_log(s->avctx, AV_LOG_ERROR, "invalid vector table id (%d)\n", header.vectable);
            return -1;
        }
    }
    if (compression_types[header.compression].algorithm == ALGO_RGB24H)
        s->avctx->pix_fmt = PIX_FMT_RGB32;
    else
        s->avctx->pix_fmt = PIX_FMT_RGB555;
    if ((header.deltaset != s->last_deltaset) || (header.vectable != s->last_vectable))
    {
        if (compression_types[header.compression].algorithm == ALGO_RGB24H)
            gen_vector_table24(s, sel_vector_table);
        else
        if (s->avctx->pix_fmt == PIX_FMT_RGB555)
            gen_vector_table15(s, sel_vector_table);
        else
            gen_vector_table16(s, sel_vector_table);
    }
    s->mb_change_bits = s->buf + header.header_size;
    if (s->flags & FLAG_KEYFRAME) {
        s->index_stream = s->mb_change_bits;
    } else {
        s->index_stream = s->mb_change_bits +
            (s->mb_change_bits_row_size * (s->avctx->height >> 2));
    }
    s->index_stream_size = s->size - (s->index_stream - s->buf);
    s->last_deltaset = header.deltaset;
    s->last_vectable = header.vectable;
    s->compression = header.compression;
    s->block_width = compression_types[header.compression].block_width;
    s->block_height = compression_types[header.compression].block_height;
    s->block_type = compression_types[header.compression].block_type;
    if (s->avctx->debug & FF_DEBUG_PICT_INFO)
        av_log(s->avctx, AV_LOG_INFO, "tables: %d / %d c:%d %dx%d t:%d %s%s%s%s\n",
            s->last_deltaset, s->last_vectable, s->compression, s->block_width,
            s->block_height, s->block_type,
            s->flags & FLAG_KEYFRAME ? " KEY" : "",
            s->flags & FLAG_INTERFRAME ? " INTER" : "",
            s->flags & FLAG_SPRITE ? " SPRITE" : "",
            s->flags & FLAG_INTERPOLATED ? " INTERPOL" : "");
    return header.header_size;
}
['static int truemotion1_decode_header(TrueMotion1Context *s)\n{\n    int i;\n    struct frame_header header;\n    uint8_t header_buffer[128];\n    const uint8_t *sel_vector_table;\n    s->mb_change_bits_row_size = ((s->avctx->width >> 2) + 7) >> 3;\n    header.header_size = ((s->buf[0] >> 5) | (s->buf[0] << 3)) & 0x7f;\n    if (s->buf[0] < 0x10)\n    {\n        av_log(s->avctx, AV_LOG_ERROR, "invalid header size (%d)\\n", s->buf[0]);\n        return -1;\n    }\n    memset(header_buffer, 0, 128);\n    for (i = 1; i < header.header_size; i++)\n        header_buffer[i - 1] = s->buf[i] ^ s->buf[i + 1];\n    header.compression = header_buffer[0];\n    header.deltaset = header_buffer[1];\n    header.vectable = header_buffer[2];\n    header.ysize = AV_RL16(&header_buffer[3]);\n    header.xsize = AV_RL16(&header_buffer[5]);\n    header.checksum = AV_RL16(&header_buffer[7]);\n    header.version = header_buffer[9];\n    header.header_type = header_buffer[10];\n    header.flags = header_buffer[11];\n    header.control = header_buffer[12];\n    if (header.version >= 2)\n    {\n        if (header.header_type > 3)\n        {\n            av_log(s->avctx, AV_LOG_ERROR, "invalid header type (%d)\\n", header.header_type);\n            return -1;\n        } else if ((header.header_type == 2) || (header.header_type == 3)) {\n            s->flags = header.flags;\n            if (!(s->flags & FLAG_INTERFRAME))\n                s->flags |= FLAG_KEYFRAME;\n        } else\n            s->flags = FLAG_KEYFRAME;\n    } else\n        s->flags = FLAG_KEYFRAME;\n    if (s->flags & FLAG_SPRITE) {\n        av_log(s->avctx, AV_LOG_INFO, "SPRITE frame found, please report the sample to the developers\\n");\n#if 0\n        s->w = header.width;\n        s->h = header.height;\n        s->x = header.xoffset;\n        s->y = header.yoffset;\n#else\n        return -1;\n#endif\n    } else {\n        s->w = header.xsize;\n        s->h = header.ysize;\n        if (header.header_type < 2) {\n            if ((s->w < 213) && (s->h >= 176))\n            {\n                s->flags |= FLAG_INTERPOLATED;\n                av_log(s->avctx, AV_LOG_INFO, "INTERPOLATION selected, please report the sample to the developers\\n");\n            }\n        }\n    }\n    if (header.compression > 17) {\n        av_log(s->avctx, AV_LOG_ERROR, "invalid compression type (%d)\\n", header.compression);\n        return -1;\n    }\n    if ((header.deltaset != s->last_deltaset) ||\n        (header.vectable != s->last_vectable))\n        select_delta_tables(s, header.deltaset);\n    if ((header.compression & 1) && header.header_type)\n        sel_vector_table = pc_tbl2;\n    else {\n        if (header.vectable < 4)\n            sel_vector_table = tables[header.vectable - 1];\n        else {\n            av_log(s->avctx, AV_LOG_ERROR, "invalid vector table id (%d)\\n", header.vectable);\n            return -1;\n        }\n    }\n    if (compression_types[header.compression].algorithm == ALGO_RGB24H)\n        s->avctx->pix_fmt = PIX_FMT_RGB32;\n    else\n        s->avctx->pix_fmt = PIX_FMT_RGB555;\n    if ((header.deltaset != s->last_deltaset) || (header.vectable != s->last_vectable))\n    {\n        if (compression_types[header.compression].algorithm == ALGO_RGB24H)\n            gen_vector_table24(s, sel_vector_table);\n        else\n        if (s->avctx->pix_fmt == PIX_FMT_RGB555)\n            gen_vector_table15(s, sel_vector_table);\n        else\n            gen_vector_table16(s, sel_vector_table);\n    }\n    s->mb_change_bits = s->buf + header.header_size;\n    if (s->flags & FLAG_KEYFRAME) {\n        s->index_stream = s->mb_change_bits;\n    } else {\n        s->index_stream = s->mb_change_bits +\n            (s->mb_change_bits_row_size * (s->avctx->height >> 2));\n    }\n    s->index_stream_size = s->size - (s->index_stream - s->buf);\n    s->last_deltaset = header.deltaset;\n    s->last_vectable = header.vectable;\n    s->compression = header.compression;\n    s->block_width = compression_types[header.compression].block_width;\n    s->block_height = compression_types[header.compression].block_height;\n    s->block_type = compression_types[header.compression].block_type;\n    if (s->avctx->debug & FF_DEBUG_PICT_INFO)\n        av_log(s->avctx, AV_LOG_INFO, "tables: %d / %d c:%d %dx%d t:%d %s%s%s%s\\n",\n            s->last_deltaset, s->last_vectable, s->compression, s->block_width,\n            s->block_height, s->block_type,\n            s->flags & FLAG_KEYFRAME ? " KEY" : "",\n            s->flags & FLAG_INTERFRAME ? " INTER" : "",\n            s->flags & FLAG_SPRITE ? " SPRITE" : "",\n            s->flags & FLAG_INTERPOLATED ? " INTERPOL" : "");\n    return header.header_size;\n}']