Statistics
| Branch: | Revision:

ffmpeg / libavcodec / xl.c @ 5509bffa

History | View | Annotate | Download (3.57 KB)

1 ab711b3c Mike Melanson
/*
2
 * Miro VideoXL codec
3
 * Copyright (c) 2004 Konstantin Shishkov
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General Public
16
 * License along with this library; if not, write to the Free Software
17 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 ab711b3c Mike Melanson
 *
19
 */
20 115329f1 Diego Biurrun
21 ab711b3c Mike Melanson
/**
22
 * @file xl.c
23
 * Miro VideoXL codec.
24
 */
25 115329f1 Diego Biurrun
26 ab711b3c Mike Melanson
#include "avcodec.h"
27
#include "mpegvideo.h"
28
29
typedef struct VideoXLContext{
30
    AVCodecContext *avctx;
31
    AVFrame pic;
32
} VideoXLContext;
33
34
const int xl_table[32] = {
35
   0,   1,   2,   3,   4,   5,   6,   7,
36
   8,   9,  12,  15,  20,  25,  34,  46,
37
  64,  82,  94, 103, 108, 113, 116, 119,
38
 120, 121, 122, 123, 124, 125, 126, 127};
39
40 115329f1 Diego Biurrun
static int decode_frame(AVCodecContext *avctx,
41 ab711b3c Mike Melanson
                        void *data, int *data_size,
42
                        uint8_t *buf, int buf_size)
43
{
44
    VideoXLContext * const a = avctx->priv_data;
45
    AVFrame * const p= (AVFrame*)&a->pic;
46
    uint8_t *Y, *U, *V;
47
    int i, j;
48
    int stride;
49
    uint32_t val;
50
    int y0, y1, y2, y3, c0, c1;
51
52
    if(p->data[0])
53
        avctx->release_buffer(avctx, p);
54
55
    p->reference = 0;
56
    if(avctx->get_buffer(avctx, p) < 0){
57
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
58
        return -1;
59
    }
60
    p->pict_type= I_TYPE;
61
    p->key_frame= 1;
62
63
    Y = a->pic.data[0];
64
    U = a->pic.data[1];
65
    V = a->pic.data[2];
66 115329f1 Diego Biurrun
67 ab711b3c Mike Melanson
    stride = avctx->width - 4;
68
    for (i = 0; i < avctx->height; i++) {
69
        /* lines are stored in reversed order */
70
        buf += stride;
71 115329f1 Diego Biurrun
72 ab711b3c Mike Melanson
        for (j = 0; j < avctx->width; j += 4) {
73
            /* value is stored in LE dword with word swapped */
74
            val = LE_32(buf);
75
            buf -= 4;
76
            val = ((val >> 16) & 0xFFFF) | ((val & 0xFFFF) << 16);
77 115329f1 Diego Biurrun
78 ab711b3c Mike Melanson
            if(!j)
79
                y0 = (val & 0x1F) << 2;
80
            else
81
                y0 = y3 + xl_table[val & 0x1F];
82
            val >>= 5;
83
            y1 = y0 + xl_table[val & 0x1F];
84
            val >>= 5;
85
            y2 = y1 + xl_table[val & 0x1F];
86
            val >>= 6; /* align to word */
87
            y3 = y2 + xl_table[val & 0x1F];
88
            val >>= 5;
89
            if(!j)
90
                c0 = (val & 0x1F) << 2;
91
            else
92
                c0 += xl_table[val & 0x1F];
93
            val >>= 5;
94
            if(!j)
95
                c1 = (val & 0x1F) << 2;
96
            else
97
                c1 += xl_table[val & 0x1F];
98 115329f1 Diego Biurrun
99 ab711b3c Mike Melanson
            Y[j + 0] = y0 << 1;
100
            Y[j + 1] = y1 << 1;
101
            Y[j + 2] = y2 << 1;
102
            Y[j + 3] = y3 << 1;
103 115329f1 Diego Biurrun
104 ab711b3c Mike Melanson
            U[j >> 2] = c0 << 1;
105
            V[j >> 2] = c1 << 1;
106
        }
107 115329f1 Diego Biurrun
108 ab711b3c Mike Melanson
        buf += avctx->width + 4;
109
        Y += a->pic.linesize[0];
110
        U += a->pic.linesize[1];
111
        V += a->pic.linesize[2];
112
    }
113
114
    *data_size = sizeof(AVFrame);
115
    *(AVFrame*)data = a->pic;
116 115329f1 Diego Biurrun
117 ab711b3c Mike Melanson
    return buf_size;
118
}
119
120
static int decode_init(AVCodecContext *avctx){
121
//    VideoXLContext * const a = avctx->priv_data;
122
123
    avctx->pix_fmt= PIX_FMT_YUV411P;
124
125
    return 0;
126
}
127
128
AVCodec xl_decoder = {
129
    "xl",
130
    CODEC_TYPE_VIDEO,
131
    CODEC_ID_VIXL,
132
    sizeof(VideoXLContext),
133
    decode_init,
134
    NULL,
135
    NULL,
136
    decode_frame,
137
    CODEC_CAP_DR1,
138
};