Mercurial > libavcodec.hg
annotate ulti.c @ 8204:507854688c43 libavcodec
Some BMP files have file size declared in the header equal to headers size
without image data, so try to correct that value before conducting checks on
declared file size.
author | kostya |
---|---|
date | Mon, 24 Nov 2008 11:24:02 +0000 |
parents | 322023e630a6 |
children | e9d9d946f213 |
rev | line source |
---|---|
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
1 /* |
2779 | 2 * IBM Ultimotion Video Decoder |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
3 * Copyright (C) 2004 Konstantin Shishkov |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
16 * |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
20 */ |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
21 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
22 /** |
2967 | 23 * @file ulti.c |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
24 * IBM Ultimotion Video Decoder. |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
25 */ |
2967 | 26 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
27 #include <stdio.h> |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
28 #include <stdlib.h> |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
29 #include <string.h> |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
30 #include <unistd.h> |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
31 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
32 #include "avcodec.h" |
5089 | 33 #include "bytestream.h" |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
34 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
35 #include "ulti_cb.h" |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
36 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
37 typedef struct UltimotionDecodeContext { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
38 AVCodecContext *avctx; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
39 int width, height, blocks; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
40 AVFrame frame; |
2834 | 41 const uint8_t *ulti_codebook; |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
42 } UltimotionDecodeContext; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
43 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
44 static av_cold int ulti_decode_init(AVCodecContext *avctx) |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
45 { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
46 UltimotionDecodeContext *s = avctx->priv_data; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
47 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
48 s->avctx = avctx; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
49 s->width = avctx->width; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
50 s->height = avctx->height; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
51 s->blocks = (s->width / 8) * (s->height / 8); |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
52 avctx->pix_fmt = PIX_FMT_YUV410P; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
53 avctx->coded_frame = (AVFrame*) &s->frame; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
54 s->ulti_codebook = ulti_codebook; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
55 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
56 return 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
57 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
58 |
7129 | 59 static const int block_coords[8] = // 4x4 block coords in 8x8 superblock |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
60 { 0, 0, 0, 4, 4, 4, 4, 0}; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
61 |
7129 | 62 static const int angle_by_index[4] = { 0, 2, 6, 12}; |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
63 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
64 /* Lookup tables for luma and chroma - used by ulti_convert_yuv() */ |
7129 | 65 static const uint8_t ulti_lumas[64] = |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
66 { 0x10, 0x13, 0x17, 0x1A, 0x1E, 0x21, 0x25, 0x28, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
67 0x2C, 0x2F, 0x33, 0x36, 0x3A, 0x3D, 0x41, 0x44, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
68 0x48, 0x4B, 0x4F, 0x52, 0x56, 0x59, 0x5C, 0x60, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
69 0x63, 0x67, 0x6A, 0x6E, 0x71, 0x75, 0x78, 0x7C, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
70 0x7F, 0x83, 0x86, 0x8A, 0x8D, 0x91, 0x94, 0x98, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
71 0x9B, 0x9F, 0xA2, 0xA5, 0xA9, 0xAC, 0xB0, 0xB3, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
72 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8, 0xCC, 0xCF, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
73 0xD3, 0xD6, 0xDA, 0xDD, 0xE1, 0xE4, 0xE8, 0xEB}; |
2967 | 74 |
7129 | 75 static const uint8_t ulti_chromas[16] = |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
76 { 0x60, 0x67, 0x6D, 0x73, 0x7A, 0x80, 0x86, 0x8D, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
77 0x93, 0x99, 0xA0, 0xA6, 0xAC, 0xB3, 0xB9, 0xC0}; |
2967 | 78 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
79 /* convert Ultimotion YUV block (sixteen 6-bit Y samples and |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
80 two 4-bit chroma samples) into standard YUV and put it into frame */ |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
81 static void ulti_convert_yuv(AVFrame *frame, int x, int y, |
2979 | 82 uint8_t *luma,int chroma) |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
83 { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
84 uint8_t *y_plane, *cr_plane, *cb_plane; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
85 int i; |
2967 | 86 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
87 y_plane = frame->data[0] + x + y * frame->linesize[0]; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
88 cr_plane = frame->data[1] + (x / 4) + (y / 4) * frame->linesize[1]; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
89 cb_plane = frame->data[2] + (x / 4) + (y / 4) * frame->linesize[2]; |
2967 | 90 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
91 cr_plane[0] = ulti_chromas[chroma >> 4]; |
2967 | 92 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
93 cb_plane[0] = ulti_chromas[chroma & 0xF]; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
94 |
2967 | 95 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
96 for(i = 0; i < 16; i++){ |
2979 | 97 y_plane[i & 3] = ulti_lumas[luma[i]]; |
98 if((i & 3) == 3) { //next row | |
99 y_plane += frame->linesize[0]; | |
100 } | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
101 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
102 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
103 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
104 /* generate block like in MS Video1 */ |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
105 static void ulti_pattern(AVFrame *frame, int x, int y, |
2979 | 106 int f0, int f1, int Y0, int Y1, int chroma) |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
107 { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
108 uint8_t Luma[16]; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
109 int mask, i; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
110 for(mask = 0x80, i = 0; mask; mask >>= 1, i++) { |
2979 | 111 if(f0 & mask) |
112 Luma[i] = Y1; | |
113 else | |
114 Luma[i] = Y0; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
115 } |
2967 | 116 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
117 for(mask = 0x80, i = 8; mask; mask >>= 1, i++) { |
2979 | 118 if(f1 & mask) |
119 Luma[i] = Y1; | |
120 else | |
121 Luma[i] = Y0; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
122 } |
2967 | 123 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
124 ulti_convert_yuv(frame, x, y, Luma, chroma); |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
125 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
126 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
127 /* fill block with some gradient */ |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
128 static void ulti_grad(AVFrame *frame, int x, int y, uint8_t *Y, int chroma, int angle) |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
129 { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
130 uint8_t Luma[16]; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
131 if(angle & 8) { //reverse order |
2979 | 132 int t; |
133 angle &= 0x7; | |
134 t = Y[0]; | |
135 Y[0] = Y[3]; | |
136 Y[3] = t; | |
137 t = Y[1]; | |
138 Y[1] = Y[2]; | |
139 Y[2] = t; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
140 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
141 switch(angle){ |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
142 case 0: |
2979 | 143 Luma[0] = Y[0]; Luma[1] = Y[1]; Luma[2] = Y[2]; Luma[3] = Y[3]; |
144 Luma[4] = Y[0]; Luma[5] = Y[1]; Luma[6] = Y[2]; Luma[7] = Y[3]; | |
145 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[2]; Luma[11] = Y[3]; | |
146 Luma[12] = Y[0]; Luma[13] = Y[1]; Luma[14] = Y[2]; Luma[15] = Y[3]; | |
147 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
148 case 1: |
2979 | 149 Luma[0] = Y[1]; Luma[1] = Y[2]; Luma[2] = Y[3]; Luma[3] = Y[3]; |
150 Luma[4] = Y[0]; Luma[5] = Y[1]; Luma[6] = Y[2]; Luma[7] = Y[3]; | |
151 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[2]; Luma[11] = Y[3]; | |
152 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[1]; Luma[15] = Y[2]; | |
153 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
154 case 2: |
2979 | 155 Luma[0] = Y[1]; Luma[1] = Y[2]; Luma[2] = Y[3]; Luma[3] = Y[3]; |
156 Luma[4] = Y[1]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[3]; | |
157 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[2]; | |
158 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[1]; Luma[15] = Y[2]; | |
159 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
160 case 3: |
2979 | 161 Luma[0] = Y[2]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[3]; |
162 Luma[4] = Y[1]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[3]; | |
163 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[2]; | |
164 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[1]; | |
165 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
166 case 4: |
2979 | 167 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[3]; |
168 Luma[4] = Y[2]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[2]; | |
169 Luma[8] = Y[1]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[1]; | |
170 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[0]; | |
171 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
172 case 5: |
2979 | 173 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[2]; |
174 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[1]; | |
175 Luma[8] = Y[2]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[0]; | |
176 Luma[12] = Y[1]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[0]; | |
177 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
178 case 6: |
2979 | 179 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[2]; Luma[3] = Y[2]; |
180 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[1]; Luma[7] = Y[1]; | |
181 Luma[8] = Y[2]; Luma[9] = Y[2]; Luma[10] = Y[1]; Luma[11] = Y[0]; | |
182 Luma[12] = Y[1]; Luma[13] = Y[1]; Luma[14] = Y[0]; Luma[15] = Y[0]; | |
183 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
184 case 7: |
2979 | 185 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[2]; Luma[3] = Y[1]; |
186 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[1]; Luma[7] = Y[0]; | |
187 Luma[8] = Y[3]; Luma[9] = Y[2]; Luma[10] = Y[1]; Luma[11] = Y[0]; | |
188 Luma[12] = Y[2]; Luma[13] = Y[1]; Luma[14] = Y[0]; Luma[15] = Y[0]; | |
189 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
190 default: |
2979 | 191 Luma[0] = Y[0]; Luma[1] = Y[0]; Luma[2] = Y[1]; Luma[3] = Y[1]; |
192 Luma[4] = Y[0]; Luma[5] = Y[0]; Luma[6] = Y[1]; Luma[7] = Y[1]; | |
193 Luma[8] = Y[2]; Luma[9] = Y[2]; Luma[10] = Y[3]; Luma[11] = Y[3]; | |
194 Luma[12] = Y[2]; Luma[13] = Y[2]; Luma[14] = Y[3]; Luma[15] = Y[3]; | |
195 break; | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
196 } |
2967 | 197 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
198 ulti_convert_yuv(frame, x, y, Luma, chroma); |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
199 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
200 |
2967 | 201 static int ulti_decode_frame(AVCodecContext *avctx, |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
202 void *data, int *data_size, |
6218 | 203 const uint8_t *buf, int buf_size) |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
204 { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
205 UltimotionDecodeContext *s=avctx->priv_data; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
206 int modifier = 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
207 int uniq = 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
208 int mode = 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
209 int blocks = 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
210 int done = 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
211 int x = 0, y = 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
212 int i; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
213 int skip; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
214 int tmp; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
215 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
216 if(s->frame.data[0]) |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
217 avctx->release_buffer(avctx, &s->frame); |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
218 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
219 s->frame.reference = 1; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
220 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
221 if(avctx->get_buffer(avctx, &s->frame) < 0) { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
222 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
223 return -1; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
224 } |
2967 | 225 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
226 while(!done) { |
2979 | 227 int idx; |
228 if(blocks >= s->blocks || y >= s->height) | |
229 break;//all blocks decoded | |
2967 | 230 |
2979 | 231 idx = *buf++; |
232 if((idx & 0xF8) == 0x70) { | |
233 switch(idx) { | |
234 case 0x70: //change modifier | |
235 modifier = *buf++; | |
236 if(modifier>1) | |
237 av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier); | |
238 break; | |
239 case 0x71: // set uniq flag | |
240 uniq = 1; | |
241 break; | |
242 case 0x72: //toggle mode | |
243 mode = !mode; | |
244 break; | |
245 case 0x73: //end-of-frame | |
246 done = 1; | |
247 break; | |
248 case 0x74: //skip some blocks | |
249 skip = *buf++; | |
250 if ((blocks + skip) >= s->blocks) | |
251 break; | |
252 blocks += skip; | |
253 x += skip * 8; | |
254 while(x >= s->width) { | |
255 x -= s->width; | |
256 y += 8; | |
257 } | |
258 break; | |
259 default: | |
260 av_log(avctx, AV_LOG_INFO, "warning: unknown escape 0x%02X\n", idx); | |
261 } | |
262 } else { //handle one block | |
263 int code; | |
264 int cf; | |
265 int angle = 0; | |
266 uint8_t Y[4]; // luma samples of block | |
267 int tx = 0, ty = 0; //coords of subblock | |
268 int chroma = 0; | |
269 if (mode || uniq) { | |
270 uniq = 0; | |
271 cf = 1; | |
272 chroma = 0; | |
273 } else { | |
274 cf = 0; | |
275 if (idx) | |
276 chroma = *buf++; | |
277 } | |
278 for (i = 0; i < 4; i++) { // for every subblock | |
279 code = (idx >> (6 - i*2)) & 3; //extract 2 bits | |
280 if(!code) //skip subblock | |
281 continue; | |
282 if(cf) | |
283 chroma = *buf++; | |
284 tx = x + block_coords[i * 2]; | |
285 ty = y + block_coords[(i * 2) + 1]; | |
286 switch(code) { | |
287 case 1: | |
288 tmp = *buf++; | |
2967 | 289 |
2979 | 290 angle = angle_by_index[(tmp >> 6) & 0x3]; |
2967 | 291 |
2979 | 292 Y[0] = tmp & 0x3F; |
293 Y[1] = Y[0]; | |
2967 | 294 |
2979 | 295 if (angle) { |
296 Y[2] = Y[0]+1; | |
297 if (Y[2] > 0x3F) | |
298 Y[2] = 0x3F; | |
299 Y[3] = Y[2]; | |
300 } else { | |
301 Y[2] = Y[0]; | |
302 Y[3] = Y[0]; | |
303 } | |
304 break; | |
2967 | 305 |
2979 | 306 case 2: |
307 if (modifier) { // unpack four luma samples | |
5089 | 308 tmp = bytestream_get_be24(&buf); |
2967 | 309 |
2979 | 310 Y[0] = (tmp >> 18) & 0x3F; |
311 Y[1] = (tmp >> 12) & 0x3F; | |
312 Y[2] = (tmp >> 6) & 0x3F; | |
313 Y[3] = tmp & 0x3F; | |
314 angle = 16; | |
315 } else { // retrieve luma samples from codebook | |
5089 | 316 tmp = bytestream_get_be16(&buf); |
2967 | 317 |
2979 | 318 angle = (tmp >> 12) & 0xF; |
319 tmp &= 0xFFF; | |
320 tmp <<= 2; | |
321 Y[0] = s->ulti_codebook[tmp]; | |
322 Y[1] = s->ulti_codebook[tmp + 1]; | |
323 Y[2] = s->ulti_codebook[tmp + 2]; | |
324 Y[3] = s->ulti_codebook[tmp + 3]; | |
325 } | |
326 break; | |
2967 | 327 |
2979 | 328 case 3: |
329 if (modifier) { // all 16 luma samples | |
330 uint8_t Luma[16]; | |
2967 | 331 |
5089 | 332 tmp = bytestream_get_be24(&buf); |
2979 | 333 Luma[0] = (tmp >> 18) & 0x3F; |
334 Luma[1] = (tmp >> 12) & 0x3F; | |
335 Luma[2] = (tmp >> 6) & 0x3F; | |
336 Luma[3] = tmp & 0x3F; | |
2967 | 337 |
5089 | 338 tmp = bytestream_get_be24(&buf); |
2979 | 339 Luma[4] = (tmp >> 18) & 0x3F; |
340 Luma[5] = (tmp >> 12) & 0x3F; | |
341 Luma[6] = (tmp >> 6) & 0x3F; | |
342 Luma[7] = tmp & 0x3F; | |
2967 | 343 |
5089 | 344 tmp = bytestream_get_be24(&buf); |
2979 | 345 Luma[8] = (tmp >> 18) & 0x3F; |
346 Luma[9] = (tmp >> 12) & 0x3F; | |
347 Luma[10] = (tmp >> 6) & 0x3F; | |
348 Luma[11] = tmp & 0x3F; | |
2967 | 349 |
5089 | 350 tmp = bytestream_get_be24(&buf); |
2979 | 351 Luma[12] = (tmp >> 18) & 0x3F; |
352 Luma[13] = (tmp >> 12) & 0x3F; | |
353 Luma[14] = (tmp >> 6) & 0x3F; | |
354 Luma[15] = tmp & 0x3F; | |
2967 | 355 |
2979 | 356 ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma); |
357 } else { | |
358 tmp = *buf++; | |
359 if(tmp & 0x80) { | |
360 angle = (tmp >> 4) & 0x7; | |
361 tmp = (tmp << 8) + *buf++; | |
362 Y[0] = (tmp >> 6) & 0x3F; | |
363 Y[1] = tmp & 0x3F; | |
364 Y[2] = (*buf++) & 0x3F; | |
365 Y[3] = (*buf++) & 0x3F; | |
366 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); //draw block | |
367 } else { // some patterns | |
368 int f0, f1; | |
369 f0 = *buf++; | |
370 f1 = tmp; | |
371 Y[0] = (*buf++) & 0x3F; | |
372 Y[1] = (*buf++) & 0x3F; | |
373 ulti_pattern(&s->frame, tx, ty, f1, f0, Y[0], Y[1], chroma); | |
374 } | |
375 } | |
376 break; | |
377 } | |
378 if(code != 3) | |
379 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); // draw block | |
380 } | |
381 blocks++; | |
382 x += 8; | |
383 if(x >= s->width) { | |
384 x = 0; | |
385 y += 8; | |
386 } | |
387 } | |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
388 } |
2967 | 389 |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
390 *data_size=sizeof(AVFrame); |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
391 *(AVFrame*)data= s->frame; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
392 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
393 return buf_size; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
394 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
395 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
396 static av_cold int ulti_decode_end(AVCodecContext *avctx) |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
397 { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
398 /* UltimotionDecodeContext *s = avctx->priv_data;*/ |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
399 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
400 return 0; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
401 } |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
402 |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
403 AVCodec ulti_decoder = { |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
404 "ultimotion", |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
405 CODEC_TYPE_VIDEO, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
406 CODEC_ID_ULTI, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
407 sizeof(UltimotionDecodeContext), |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
408 ulti_decode_init, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
409 NULL, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
410 ulti_decode_end, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
411 ulti_decode_frame, |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
412 CODEC_CAP_DR1, |
6712 | 413 NULL, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
414 .long_name = NULL_IF_CONFIG_SMALL("IBM UltiMotion"), |
2234
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
415 }; |
dff53892ff8a
IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
416 |