static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
                        AVPacket *avpkt) {
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
    AVSubtitle *sub = data;
    const uint8_t *buf_end = buf + buf_size;
    uint8_t *bitmap;
    int w, h, x, y, i, ret;
    int64_t packet_time = 0;
    GetBitContext gb;
    int has_alpha = avctx->codec_tag == MKTAG('D','X','S','A');
    // check that at least header fits
    if (buf_size < 27 + 7 * 2 + 4 * (3 + has_alpha)) {
        av_log(avctx, AV_LOG_ERROR, "coded frame size %d too small\n", buf_size);
        return -1;
    }
    // read start and end time
    if (buf[0] != '[' || buf[13] != '-' || buf[26] != ']') {
        av_log(avctx, AV_LOG_ERROR, "invalid time code\n");
        return -1;
    }
    if (avpkt->pts != AV_NOPTS_VALUE)
        packet_time = av_rescale_q(avpkt->pts, AV_TIME_BASE_Q, (AVRational){1, 1000});
    sub->start_display_time = parse_timecode(buf +  1, packet_time);
    sub->end_display_time   = parse_timecode(buf + 14, packet_time);
    buf += 27;
    // read header
    w = bytestream_get_le16(&buf);
    h = bytestream_get_le16(&buf);
    if (av_image_check_size(w, h, 0, avctx) < 0)
        return -1;
    x = bytestream_get_le16(&buf);
    y = bytestream_get_le16(&buf);
    // skip bottom right position, it gives no new information
    bytestream_get_le16(&buf);
    bytestream_get_le16(&buf);
    // The following value is supposed to indicate the start offset
    // (relative to the palette) of the data for the second field,
    // however there are files in which it has a bogus value and thus
    // we just ignore it
    bytestream_get_le16(&buf);
    // allocate sub and set values
    sub->rects =  av_mallocz(sizeof(*sub->rects));
    if (!sub->rects)
        return AVERROR(ENOMEM);
    sub->rects[0] = av_mallocz(sizeof(*sub->rects[0]));
    if (!sub->rects[0]) {
        av_freep(&sub->rects);
        return AVERROR(ENOMEM);
    }
    sub->rects[0]->x = x; sub->rects[0]->y = y;
    sub->rects[0]->w = w; sub->rects[0]->h = h;
    sub->rects[0]->type = SUBTITLE_BITMAP;
    sub->rects[0]->linesize[0] = w;
    sub->rects[0]->data[0] = av_malloc(w * h);
    sub->rects[0]->nb_colors = 4;
    sub->rects[0]->data[1] = av_mallocz(AVPALETTE_SIZE);
    if (!sub->rects[0]->data[0] || !sub->rects[0]->data[1]) {
        av_freep(&sub->rects[0]->data[1]);
        av_freep(&sub->rects[0]->data[0]);
        av_freep(&sub->rects[0]);
        av_freep(&sub->rects);
        return AVERROR(ENOMEM);
    }
    sub->num_rects = 1;
    // read palette
    for (i = 0; i < sub->rects[0]->nb_colors; i++)
        ((uint32_t*)sub->rects[0]->data[1])[i] = bytestream_get_be24(&buf);
    if (!has_alpha) {
        // make all except background (first entry) non-transparent
        for (i = 1; i < sub->rects[0]->nb_colors; i++)
            ((uint32_t *)sub->rects[0]->data[1])[i] |= 0xff000000;
    } else {
        for (i = 0; i < sub->rects[0]->nb_colors; i++)
            ((uint32_t *)sub->rects[0]->data[1])[i] |= *buf++ << 24;
    }
#if FF_API_AVPICTURE
FF_DISABLE_DEPRECATION_WARNINGS
{
    AVSubtitleRect *rect;
    int j;
    rect = sub->rects[0];
    for (j = 0; j < 4; j++) {
        rect->pict.data[j] = rect->data[j];
        rect->pict.linesize[j] = rect->linesize[j];
    }
}
FF_ENABLE_DEPRECATION_WARNINGS
#endif
    // process RLE-compressed data
    if ((ret = init_get_bits8(&gb, buf, buf_end - buf)) < 0)
        return ret;
    bitmap = sub->rects[0]->data[0];
    for (y = 0; y < h; y++) {
        // interlaced: do odd lines
        if (y == (h + 1) / 2) bitmap = sub->rects[0]->data[0] + w;
        for (x = 0; x < w; ) {
            int log2 = ff_log2_tab[show_bits(&gb, 8)];
            int run = get_bits(&gb, 14 - 4 * (log2 >> 1));
            int color = get_bits(&gb, 2);
            run = FFMIN(run, w - x);
            // run length 0 means till end of row
            if (!run) run = w - x;
            memset(bitmap, color, run);
            bitmap += run;
            x += run;
        }
        // interlaced, skip every second line
        bitmap += w;
        align_get_bits(&gb);
    }
    *data_size = 1;
    return buf_size;
}
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
                        AVPacket *avpkt) {
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
    AVSubtitle *sub = data;
    const uint8_t *buf_end = buf + buf_size;
    uint8_t *bitmap;
    int w, h, x, y, i, ret;
    int64_t packet_time = 0;
    GetBitContext gb;
    int has_alpha = avctx->codec_tag == MKTAG('D','X','S','A');
    
    if (buf_size < 27 + 7 * 2 + 4 * (3 + has_alpha)) {
        av_log(avctx, AV_LOG_ERROR, "coded frame size %d too small\n", buf_size);
        return -1;
    }
    
    if (buf[0] != '[' || buf[13] != '-' || buf[26] != ']') {
        av_log(avctx, AV_LOG_ERROR, "invalid time code\n");
        return -1;
    }
    if (avpkt->pts != AV_NOPTS_VALUE)
        packet_time = av_rescale_q(avpkt->pts, AV_TIME_BASE_Q, (AVRational){1, 1000});
    sub->start_display_time = parse_timecode(buf +  1, packet_time);
    sub->end_display_time   = parse_timecode(buf + 14, packet_time);
    buf += 27;
    
    w = bytestream_get_le16(&buf);
    h = bytestream_get_le16(&buf);
    if (av_image_check_size(w, h, 0, avctx) < 0)
        return -1;
    x = bytestream_get_le16(&buf);
    y = bytestream_get_le16(&buf);
    
    bytestream_get_le16(&buf);
    bytestream_get_le16(&buf);
    
    
    
    
    bytestream_get_le16(&buf);
    
    sub->rects =  av_mallocz(sizeof(*sub->rects));
    if (!sub->rects)
        return AVERROR(ENOMEM);
    sub->rects[0] = av_mallocz(sizeof(*sub->rects[0]));
    if (!sub->rects[0]) {
        av_freep(&sub->rects);
        return AVERROR(ENOMEM);
    }
    sub->rects[0]->x = x; sub->rects[0]->y = y;
    sub->rects[0]->w = w; sub->rects[0]->h = h;
    sub->rects[0]->type = SUBTITLE_BITMAP;
    sub->rects[0]->linesize[0] = w;
    sub->rects[0]->data[0] = av_malloc(w * h);
    sub->rects[0]->nb_colors = 4;
    sub->rects[0]->data[1] = av_mallocz(AVPALETTE_SIZE);
    if (!sub->rects[0]->data[0] || !sub->rects[0]->data[1]) {
        av_freep(&sub->rects[0]->data[1]);
        av_freep(&sub->rects[0]->data[0]);
        av_freep(&sub->rects[0]);
        av_freep(&sub->rects);
        return AVERROR(ENOMEM);
    }
    sub->num_rects = 1;
    
    for (i = 0; i < sub->rects[0]->nb_colors; i++)
        ((uint32_t*)sub->rects[0]->data[1])[i] = bytestream_get_be24(&buf);
    if (!has_alpha) {
        
        for (i = 1; i < sub->rects[0]->nb_colors; i++)
            ((uint32_t *)sub->rects[0]->data[1])[i] |= 0xff000000;
    } else {
        for (i = 0; i < sub->rects[0]->nb_colors; i++)
            ((uint32_t *)sub->rects[0]->data[1])[i] |= *buf++ << 24;
    }
#if FF_API_AVPICTURE
FF_DISABLE_DEPRECATION_WARNINGS
{
    AVSubtitleRect *rect;
    int j;
    rect = sub->rects[0];
    for (j = 0; j < 4; j++) {
        rect->pict.data[j] = rect->data[j];
        rect->pict.linesize[j] = rect->linesize[j];
    }
}
FF_ENABLE_DEPRECATION_WARNINGS
#endif
    
    if ((ret = init_get_bits8(&gb, buf, buf_end - buf)) < 0)
        return ret;
    bitmap = sub->rects[0]->data[0];
    for (y = 0; y < h; y++) {
        
        if (y == (h + 1) / 2) bitmap = sub->rects[0]->data[0] + w;
        for (x = 0; x < w; ) {
            int log2 = ff_log2_tab[show_bits(&gb, 8)];
            int run = get_bits(&gb, 14 - 4 * (log2 >> 1));
            int color = get_bits(&gb, 2);
            run = FFMIN(run, w - x);
            
            if (!run) run = w - x;
            memset(bitmap, color, run);
            bitmap += run;
            x += run;
        }
        
        bitmap += w;
        align_get_bits(&gb);
    }
    *data_size = 1;
    return buf_size;
}
static int FUNC_0(AVCodecContext *VAR_0, void *VAR_1, int *VAR_2,
                        AVPacket *VAR_3) {
    const uint8_t *VAR_4 = VAR_3->VAR_1;
    int VAR_5 = VAR_3->size;
    AVSubtitle *sub = VAR_1;
    const uint8_t *VAR_6 = VAR_4 + VAR_5;
    uint8_t *bitmap;
    int VAR_7, VAR_8, VAR_9, VAR_10, VAR_11, VAR_12;
    int64_t packet_time = 0;
    GetBitContext gb;
    int VAR_13 = VAR_0->codec_tag == MKTAG('D','X','S','A');
    
    if (VAR_5 < 27 + 7 * 2 + 4 * (3 + VAR_13)) {
        av_log(VAR_0, AV_LOG_ERROR, "coded frame size %d too small\n", VAR_5);
        return -1;
    }
    
    if (VAR_4[0] != '[' || VAR_4[13] != '-' || VAR_4[26] != ']') {
        av_log(VAR_0, AV_LOG_ERROR, "invalid time code\n");
        return -1;
    }
    if (VAR_3->pts != AV_NOPTS_VALUE)
        packet_time = av_rescale_q(VAR_3->pts, AV_TIME_BASE_Q, (AVRational){1, 1000});
    sub->start_display_time = parse_timecode(VAR_4 +  1, packet_time);
    sub->end_display_time   = parse_timecode(VAR_4 + 14, packet_time);
    VAR_4 += 27;
    
    VAR_7 = bytestream_get_le16(&VAR_4);
    VAR_8 = bytestream_get_le16(&VAR_4);
    if (av_image_check_size(VAR_7, VAR_8, 0, VAR_0) < 0)
        return -1;
    VAR_9 = bytestream_get_le16(&VAR_4);
    VAR_10 = bytestream_get_le16(&VAR_4);
    
    bytestream_get_le16(&VAR_4);
    bytestream_get_le16(&VAR_4);
    
    
    
    
    bytestream_get_le16(&VAR_4);
    
    sub->rects =  av_mallocz(sizeof(*sub->rects));
    if (!sub->rects)
        return AVERROR(ENOMEM);
    sub->rects[0] = av_mallocz(sizeof(*sub->rects[0]));
    if (!sub->rects[0]) {
        av_freep(&sub->rects);
        return AVERROR(ENOMEM);
    }
    sub->rects[0]->VAR_9 = VAR_9; sub->rects[0]->VAR_10 = VAR_10;
    sub->rects[0]->VAR_7 = VAR_7; sub->rects[0]->VAR_8 = VAR_8;
    sub->rects[0]->type = SUBTITLE_BITMAP;
    sub->rects[0]->linesize[0] = VAR_7;
    sub->rects[0]->VAR_1[0] = av_malloc(VAR_7 * VAR_8);
    sub->rects[0]->nb_colors = 4;
    sub->rects[0]->VAR_1[1] = av_mallocz(AVPALETTE_SIZE);
    if (!sub->rects[0]->VAR_1[0] || !sub->rects[0]->VAR_1[1]) {
        av_freep(&sub->rects[0]->VAR_1[1]);
        av_freep(&sub->rects[0]->VAR_1[0]);
        av_freep(&sub->rects[0]);
        av_freep(&sub->rects);
        return AVERROR(ENOMEM);
    }
    sub->num_rects = 1;
    
    for (VAR_11 = 0; VAR_11 < sub->rects[0]->nb_colors; VAR_11++)
        ((uint32_t*)sub->rects[0]->VAR_1[1])[VAR_11] = bytestream_get_be24(&VAR_4);
    if (!VAR_13) {
        
        for (VAR_11 = 1; VAR_11 < sub->rects[0]->nb_colors; VAR_11++)
            ((uint32_t *)sub->rects[0]->VAR_1[1])[VAR_11] |= 0xff000000;
    } else {
        for (VAR_11 = 0; VAR_11 < sub->rects[0]->nb_colors; VAR_11++)
            ((uint32_t *)sub->rects[0]->VAR_1[1])[VAR_11] |= *VAR_4++ << 24;
    }
#if FF_API_AVPICTURE
FF_DISABLE_DEPRECATION_WARNINGS
{
    AVSubtitleRect *rect;
    int j;
    rect = sub->rects[0];
    for (j = 0; j < 4; j++) {
        rect->pict.VAR_1[j] = rect->VAR_1[j];
        rect->pict.linesize[j] = rect->linesize[j];
    }
}
FF_ENABLE_DEPRECATION_WARNINGS
#endif
    
    if ((VAR_12 = init_get_bits8(&gb, VAR_4, VAR_6 - VAR_4)) < 0)
        return VAR_12;
    bitmap = sub->rects[0]->VAR_1[0];
    for (VAR_10 = 0; VAR_10 < VAR_8; VAR_10++) {
        
        if (VAR_10 == (VAR_8 + 1) / 2) bitmap = sub->rects[0]->VAR_1[0] + VAR_7;
        for (VAR_9 = 0; VAR_9 < VAR_7; ) {
            int VAR_14 = ff_log2_tab[show_bits(&gb, 8)];
            int VAR_15 = get_bits(&gb, 14 - 4 * (VAR_14 >> 1));
            int VAR_16 = get_bits(&gb, 2);
            VAR_15 = FFMIN(VAR_15, VAR_7 - VAR_9);
            
            if (!VAR_15) VAR_15 = VAR_7 - VAR_9;
            memset(bitmap, VAR_16, VAR_15);
            bitmap += VAR_15;
            VAR_9 += VAR_15;
        }
        
        bitmap += VAR_7;
        align_get_bits(&gb);
    }
    *VAR_2 = 1;
    return VAR_5;
}
static int FUNC_0(AVCodecContext *VAR_0, void *VAR_1, int *VAR_2,
AVPacket *VAR_3) { const uint8_t *VAR_4 = VAR_3->VAR_1; int VAR_5 = VAR_3->size; AVSubtitle *sub = VAR_1; const uint8_t *VAR_6 = VAR_4 + VAR_5; uint8_t *bitmap; int VAR_7, VAR_8, VAR_9, VAR_10, VAR_11, VAR_12; int64_t packet_time = 0; GetBitContext gb; int VAR_13 = VAR_0->codec_tag == MKTAG('D','X','S','A'); if (VAR_5 < 27 + 7 * 2 + 4 * (3 + VAR_13)) { av_log(VAR_0, AV_LOG_ERROR, "coded frame size %d too small\n", VAR_5); return -1; } if (VAR_4[0] != '[' || VAR_4[13] != '-' || VAR_4[26] != ']') { av_log(VAR_0, AV_LOG_ERROR, "invalid time code\n"); return -1; } if (VAR_3->pts != AV_NOPTS_VALUE)
packet_time = av_rescale_q(VAR_3->pts, AV_TIME_BASE_Q, (AVRational){1, 1000}); sub->start_display_time = parse_timecode(VAR_4 +  1, packet_time); sub->end_display_time   = parse_timecode(VAR_4 + 14, packet_time); VAR_4 += 27; VAR_7 = bytestream_get_le16(&VAR_4); VAR_8 = bytestream_get_le16(&VAR_4); if (av_image_check_size(VAR_7, VAR_8, 0, VAR_0) < 0)
return -1; VAR_9 = bytestream_get_le16(&VAR_4); VAR_10 = bytestream_get_le16(&VAR_4); bytestream_get_le16(&VAR_4); bytestream_get_le16(&VAR_4); bytestream_get_le16(&VAR_4); sub->rects =  av_mallocz(sizeof(*sub->rects)); if (!sub->rects)
return AVERROR(ENOMEM); sub->rects[0] = av_mallocz(sizeof(*sub->rects[0])); if (!sub->rects[0]) { av_freep(&sub->rects); return AVERROR(ENOMEM); } sub->rects[0]->VAR_9 = VAR_9; sub->rects[0]->VAR_10 = VAR_10; sub->rects[0]->VAR_7 = VAR_7; sub->rects[0]->VAR_8 = VAR_8; sub->rects[0]->type = SUBTITLE_BITMAP; sub->rects[0]->linesize[0] = VAR_7; sub->rects[0]->VAR_1[0] = av_malloc(VAR_7 * VAR_8); sub->rects[0]->nb_colors = 4; sub->rects[0]->VAR_1[1] = av_mallocz(AVPALETTE_SIZE); if (!sub->rects[0]->VAR_1[0] || !sub->rects[0]->VAR_1[1]) { av_freep(&sub->rects[0]->VAR_1[1]); av_freep(&sub->rects[0]->VAR_1[0]); av_freep(&sub->rects[0]); av_freep(&sub->rects); return AVERROR(ENOMEM); } sub->num_rects = 1; for (VAR_11 = 0; VAR_11 < sub->rects[0]->nb_colors; VAR_11++) ((uint32_t*)sub->rects[0]->VAR_1[1])[VAR_11] = bytestream_get_be24(&VAR_4); if (!VAR_13) { for (VAR_11 = 1; VAR_11 < sub->rects[0]->nb_colors; VAR_11++) ((uint32_t *)sub->rects[0]->VAR_1[1])[VAR_11] |= 0xff000000; } else { for (VAR_11 = 0; VAR_11 < sub->rects[0]->nb_colors; VAR_11++) ((uint32_t *)sub->rects[0]->VAR_1[1])[VAR_11] |= *VAR_4++ << 24; } #if FF_API_AVPICTURE
FF_DISABLE_DEPRECATION_WARNINGS
{ AVSubtitleRect *rect; int j; rect = sub->rects[0]; for (j = 0; j < 4; j++) { rect->pict.VAR_1[j] = rect->VAR_1[j]; rect->pict.linesize[j] = rect->linesize[j]; } } FF_ENABLE_DEPRECATION_WARNINGS
#endif
if ((VAR_12 = init_get_bits8(&gb, VAR_4, VAR_6 - VAR_4)) < 0)
return VAR_12; bitmap = sub->rects[0]->VAR_1[0]; for (VAR_10 = 0; VAR_10 < VAR_8; VAR_10++) { if (VAR_10 == (VAR_8 + 1) / 2) bitmap = sub->rects[0]->VAR_1[0] + VAR_7; for (VAR_9 = 0; VAR_9 < VAR_7; ) { int VAR_14 = ff_log2_tab[show_bits(&gb, 8)]; int VAR_15 = get_bits(&gb, 14 - 4 * (VAR_14 >> 1)); int VAR_16 = get_bits(&gb, 2); VAR_15 = FFMIN(VAR_15, VAR_7 - VAR_9); if (!VAR_15) VAR_15 = VAR_7 - VAR_9; memset(bitmap, VAR_16, VAR_15); bitmap += VAR_15; VAR_9 += VAR_15; } bitmap += VAR_7; align_get_bits(&gb); } *VAR_2 = 1; return VAR_5; }