annotate ulti.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents dff53892ff8a
children e65877799a09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
1 /*
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
2 *
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 *
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
9 *
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
13 * Lesser General Public License for more details.
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
14 *
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
18 *
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
19 * IBM Ultimotion Video Decoder
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
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
23 /**
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
24 * @file ulti.c
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
25 * IBM Ultimotion Video Decoder.
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
26 */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
27
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
28 #include <stdio.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
29 #include <stdlib.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
30 #include <string.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
31 #include <unistd.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
32
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
33 #include "common.h"
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
34 #include "avcodec.h"
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
35
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
36 #include "ulti_cb.h"
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
37
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
38 typedef struct UltimotionDecodeContext {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
39 AVCodecContext *avctx;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
40 int width, height, blocks;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
41 AVFrame frame;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
42 uint8_t *ulti_codebook;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
43 } UltimotionDecodeContext;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
44
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
45 static int ulti_decode_init(AVCodecContext *avctx)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
46 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
47 UltimotionDecodeContext *s = avctx->priv_data;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
48
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
49 s->avctx = avctx;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
50 s->width = avctx->width;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
51 s->height = avctx->height;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
52 s->blocks = (s->width / 8) * (s->height / 8);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
53 avctx->pix_fmt = PIX_FMT_YUV410P;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
54 avctx->has_b_frames = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
55 avctx->coded_frame = (AVFrame*) &s->frame;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
56 s->ulti_codebook = ulti_codebook;
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 return 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
59 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
60
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
61 static int block_coords[8] = // 4x4 block coords in 8x8 superblock
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
62 { 0, 0, 0, 4, 4, 4, 4, 0};
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 static int angle_by_index[4] = { 0, 2, 6, 12};
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
65
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
66 /* Lookup tables for luma and chroma - used by ulti_convert_yuv() */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
67 static uint8_t ulti_lumas[64] =
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
68 { 0x10, 0x13, 0x17, 0x1A, 0x1E, 0x21, 0x25, 0x28,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
69 0x2C, 0x2F, 0x33, 0x36, 0x3A, 0x3D, 0x41, 0x44,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
70 0x48, 0x4B, 0x4F, 0x52, 0x56, 0x59, 0x5C, 0x60,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
71 0x63, 0x67, 0x6A, 0x6E, 0x71, 0x75, 0x78, 0x7C,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
72 0x7F, 0x83, 0x86, 0x8A, 0x8D, 0x91, 0x94, 0x98,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
73 0x9B, 0x9F, 0xA2, 0xA5, 0xA9, 0xAC, 0xB0, 0xB3,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
74 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8, 0xCC, 0xCF,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
75 0xD3, 0xD6, 0xDA, 0xDD, 0xE1, 0xE4, 0xE8, 0xEB};
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
76
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
77 static uint8_t ulti_chromas[16] =
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
78 { 0x60, 0x67, 0x6D, 0x73, 0x7A, 0x80, 0x86, 0x8D,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
79 0x93, 0x99, 0xA0, 0xA6, 0xAC, 0xB3, 0xB9, 0xC0};
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
80
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
81 /* convert Ultimotion YUV block (sixteen 6-bit Y samples and
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
82 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
83 static void ulti_convert_yuv(AVFrame *frame, int x, int y,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
84 uint8_t *luma,int chroma)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
85 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
86 uint8_t *y_plane, *cr_plane, *cb_plane;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
87 int i;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
88
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
89 y_plane = frame->data[0] + x + y * frame->linesize[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
90 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
91 cb_plane = frame->data[2] + (x / 4) + (y / 4) * frame->linesize[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
92
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
93 cr_plane[0] = ulti_chromas[chroma >> 4];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
94
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
95 cb_plane[0] = ulti_chromas[chroma & 0xF];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
96
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
97
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
98 for(i = 0; i < 16; i++){
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
99 y_plane[i & 3] = ulti_lumas[luma[i]];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
100 if((i & 3) == 3) { //next row
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
101 y_plane += frame->linesize[0];
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 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
105
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
106 /* generate block like in MS Video1 */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
107 static void ulti_pattern(AVFrame *frame, int x, int y,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
108 int f0, int f1, int Y0, int Y1, int chroma)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
109 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
110 uint8_t Luma[16];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
111 int mask, i;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
112 for(mask = 0x80, i = 0; mask; mask >>= 1, i++) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
113 if(f0 & mask)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
114 Luma[i] = Y1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
115 else
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
116 Luma[i] = Y0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
117 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
118
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
119 for(mask = 0x80, i = 8; mask; mask >>= 1, i++) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
120 if(f1 & mask)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
121 Luma[i] = Y1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
122 else
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
123 Luma[i] = Y0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
124 }
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 ulti_convert_yuv(frame, x, y, Luma, chroma);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
127 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
128
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
129 /* fill block with some gradient */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
130 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
131 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
132 uint8_t Luma[16];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
133 if(angle & 8) { //reverse order
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
134 int t;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
135 angle &= 0x7;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
136 t = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
137 Y[0] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
138 Y[3] = t;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
139 t = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
140 Y[1] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
141 Y[2] = t;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
142 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
143 switch(angle){
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
144 case 0:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
145 Luma[0] = Y[0]; Luma[1] = Y[1]; Luma[2] = Y[2]; Luma[3] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
146 Luma[4] = Y[0]; Luma[5] = Y[1]; Luma[6] = Y[2]; Luma[7] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
147 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[2]; Luma[11] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
148 Luma[12] = Y[0]; Luma[13] = Y[1]; Luma[14] = Y[2]; Luma[15] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
149 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
150 case 1:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
151 Luma[0] = Y[1]; Luma[1] = Y[2]; Luma[2] = Y[3]; Luma[3] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
152 Luma[4] = Y[0]; Luma[5] = Y[1]; Luma[6] = Y[2]; Luma[7] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
153 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[2]; Luma[11] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
154 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[1]; Luma[15] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
155 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
156 case 2:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
157 Luma[0] = Y[1]; Luma[1] = Y[2]; Luma[2] = Y[3]; Luma[3] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
158 Luma[4] = Y[1]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
159 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
160 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[1]; Luma[15] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
161 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
162 case 3:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
163 Luma[0] = Y[2]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
164 Luma[4] = Y[1]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
165 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
166 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
167 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
168 case 4:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
169 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
170 Luma[4] = Y[2]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
171 Luma[8] = Y[1]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
172 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
173 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
174 case 5:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
175 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
176 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
177 Luma[8] = Y[2]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
178 Luma[12] = Y[1]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
179 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
180 case 6:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
181 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[2]; Luma[3] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
182 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[1]; Luma[7] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
183 Luma[8] = Y[2]; Luma[9] = Y[2]; Luma[10] = Y[1]; Luma[11] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
184 Luma[12] = Y[1]; Luma[13] = Y[1]; Luma[14] = Y[0]; Luma[15] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
185 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
186 case 7:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
187 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[2]; Luma[3] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
188 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[1]; Luma[7] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
189 Luma[8] = Y[3]; Luma[9] = Y[2]; Luma[10] = Y[1]; Luma[11] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
190 Luma[12] = Y[2]; Luma[13] = Y[1]; Luma[14] = Y[0]; Luma[15] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
191 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
192 default:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
193 Luma[0] = Y[0]; Luma[1] = Y[0]; Luma[2] = Y[1]; Luma[3] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
194 Luma[4] = Y[0]; Luma[5] = Y[0]; Luma[6] = Y[1]; Luma[7] = Y[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
195 Luma[8] = Y[2]; Luma[9] = Y[2]; Luma[10] = Y[3]; Luma[11] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
196 Luma[12] = Y[2]; Luma[13] = Y[2]; Luma[14] = Y[3]; Luma[15] = Y[3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
197 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
198 }
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 ulti_convert_yuv(frame, x, y, Luma, chroma);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
201 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
202
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
203 static int ulti_decode_frame(AVCodecContext *avctx,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
204 void *data, int *data_size,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
205 uint8_t *buf, int buf_size)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
206 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
207 UltimotionDecodeContext *s=avctx->priv_data;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
208 int modifier = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
209 int uniq = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
210 int mode = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
211 int blocks = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
212 int done = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
213 int x = 0, y = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
214 int i;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
215 int skip;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
216 int tmp;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
217
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
218 if(s->frame.data[0])
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
219 avctx->release_buffer(avctx, &s->frame);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
220
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
221 s->frame.reference = 1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
222 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
223 if(avctx->get_buffer(avctx, &s->frame) < 0) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
224 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
225 return -1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
226 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
227
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
228 while(!done) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
229 int idx;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
230 if(blocks >= s->blocks || y >= s->height)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
231 break;//all blocks decoded
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
232
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
233 idx = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
234 if((idx & 0xF8) == 0x70) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
235 switch(idx) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
236 case 0x70: //change modifier
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
237 modifier = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
238 if(modifier>1)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
239 av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
240 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
241 case 0x71: // set uniq flag
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
242 uniq = 1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
243 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
244 case 0x72: //toggle mode
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
245 mode = !mode;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
246 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
247 case 0x73: //end-of-frame
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
248 done = 1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
249 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
250 case 0x74: //skip some blocks
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
251 skip = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
252 if ((blocks + skip) >= s->blocks)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
253 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
254 blocks += skip;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
255 x += skip * 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
256 while(x >= s->width) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
257 x -= s->width;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
258 y += 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
259 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
260 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
261 default:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
262 av_log(avctx, AV_LOG_INFO, "warning: unknown escape 0x%02X\n", idx);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
263 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
264 } else { //handle one block
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
265 int code;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
266 int cf;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
267 int angle = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
268 uint8_t Y[4]; // luma samples of block
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
269 int tx = 0, ty = 0; //coords of subblock
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
270 int chroma = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
271 if (mode || uniq) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
272 uniq = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
273 cf = 1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
274 chroma = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
275 } else {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
276 cf = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
277 if (idx)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
278 chroma = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
279 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
280 for (i = 0; i < 4; i++) { // for every subblock
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
281 code = (idx >> (6 - i*2)) & 3; //extract 2 bits
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
282 if(!code) //skip subblock
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
283 continue;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
284 if(cf)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
285 chroma = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
286 tx = x + block_coords[i * 2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
287 ty = y + block_coords[(i * 2) + 1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
288 switch(code) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
289 case 1:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
290 tmp = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
291
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
292 angle = angle_by_index[(tmp >> 6) & 0x3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
293
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
294 Y[0] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
295 Y[1] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
296
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
297 if (angle) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
298 Y[2] = Y[0]+1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
299 if (Y[2] > 0x3F)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
300 Y[2] = 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
301 Y[3] = Y[2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
302 } else {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
303 Y[2] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
304 Y[3] = Y[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
305 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
306 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
307
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
308 case 2:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
309 if (modifier) { // unpack four luma samples
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
310 tmp = (*buf++) << 16;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
311 tmp += (*buf++) << 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
312 tmp += *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
313
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
314 Y[0] = (tmp >> 18) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
315 Y[1] = (tmp >> 12) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
316 Y[2] = (tmp >> 6) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
317 Y[3] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
318 angle = 16;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
319 } else { // retrieve luma samples from codebook
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
320 tmp = (*buf++) << 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
321 tmp += (*buf++);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
322
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
323 angle = (tmp >> 12) & 0xF;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
324 tmp &= 0xFFF;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
325 tmp <<= 2;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
326 Y[0] = s->ulti_codebook[tmp];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
327 Y[1] = s->ulti_codebook[tmp + 1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
328 Y[2] = s->ulti_codebook[tmp + 2];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
329 Y[3] = s->ulti_codebook[tmp + 3];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
330 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
331 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
332
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
333 case 3:
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
334 if (modifier) { // all 16 luma samples
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
335 uint8_t Luma[16];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
336
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
337 tmp = (*buf++) << 16;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
338 tmp += (*buf++) << 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
339 tmp += *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
340 Luma[0] = (tmp >> 18) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
341 Luma[1] = (tmp >> 12) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
342 Luma[2] = (tmp >> 6) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
343 Luma[3] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
344
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
345 tmp = (*buf++) << 16;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
346 tmp += (*buf++) << 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
347 tmp += *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
348 Luma[4] = (tmp >> 18) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
349 Luma[5] = (tmp >> 12) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
350 Luma[6] = (tmp >> 6) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
351 Luma[7] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
352
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
353 tmp = (*buf++) << 16;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
354 tmp += (*buf++) << 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
355 tmp += *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
356 Luma[8] = (tmp >> 18) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
357 Luma[9] = (tmp >> 12) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
358 Luma[10] = (tmp >> 6) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
359 Luma[11] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
360
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
361 tmp = (*buf++) << 16;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
362 tmp += (*buf++) << 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
363 tmp += *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
364 Luma[12] = (tmp >> 18) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
365 Luma[13] = (tmp >> 12) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
366 Luma[14] = (tmp >> 6) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
367 Luma[15] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
368
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
369 ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
370 } else {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
371 tmp = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
372 if(tmp & 0x80) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
373 angle = (tmp >> 4) & 0x7;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
374 tmp = (tmp << 8) + *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
375 Y[0] = (tmp >> 6) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
376 Y[1] = tmp & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
377 Y[2] = (*buf++) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
378 Y[3] = (*buf++) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
379 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); //draw block
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
380 } else { // some patterns
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
381 int f0, f1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
382 f0 = *buf++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
383 f1 = tmp;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
384 Y[0] = (*buf++) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
385 Y[1] = (*buf++) & 0x3F;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
386 ulti_pattern(&s->frame, tx, ty, f1, f0, Y[0], Y[1], chroma);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
387 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
388 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
389 break;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
390 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
391 if(code != 3)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
392 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); // draw block
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
393 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
394 blocks++;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
395 x += 8;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
396 if(x >= s->width) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
397 x = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
398 y += 8;
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 }
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 *data_size=sizeof(AVFrame);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
404 *(AVFrame*)data= s->frame;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
405
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
406 return buf_size;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
407 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
408
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
409 static int ulti_decode_end(AVCodecContext *avctx)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
410 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
411 /* UltimotionDecodeContext *s = avctx->priv_data;*/
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
412
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
413 return 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
414 }
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 AVCodec ulti_decoder = {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
417 "ultimotion",
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
418 CODEC_TYPE_VIDEO,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
419 CODEC_ID_ULTI,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
420 sizeof(UltimotionDecodeContext),
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
421 ulti_decode_init,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
422 NULL,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
423 ulti_decode_end,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
424 ulti_decode_frame,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
425 CODEC_CAP_DR1,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
426 NULL
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
427 };
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
428