annotate ulti.c @ 3990:746a60ba3177 libavcodec

enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author michael
date Wed, 11 Oct 2006 12:23:40 +0000
parents c8c591fe26f8
children 59f4fb490fa7
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 /*
2779
alex
parents: 2234
diff changeset
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
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
23 /**
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
24 * @file ulti.c
2234
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 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
27
2234
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;
2834
fd5d7c732c6b kill a bunch of compiler warnings
mru
parents: 2779
diff changeset
42 const uint8_t *ulti_codebook;
2234
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};
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
76
2234
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};
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
80
2234
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,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
84 uint8_t *luma,int chroma)
2234
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;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
88
2234
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];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
92
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
93 cr_plane[0] = ulti_chromas[chroma >> 4];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
94
2234
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
97
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
98 for(i = 0; i < 16; i++){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 y_plane[i & 3] = ulti_lumas[luma[i]];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
100 if((i & 3) == 3) { //next row
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
101 y_plane += frame->linesize[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
102 }
2234
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,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
108 int f0, int f1, int Y0, int Y1, int chroma)
2234
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++) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
113 if(f0 & mask)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
114 Luma[i] = Y1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
115 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
116 Luma[i] = Y0;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
117 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
118
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
119 for(mask = 0x80, i = 8; mask; mask >>= 1, i++) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 if(f1 & mask)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 Luma[i] = Y1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
123 Luma[i] = Y0;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
124 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
125
2234
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
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
134 int t;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
135 angle &= 0x7;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 t = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
137 Y[0] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
138 Y[3] = t;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
139 t = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
140 Y[1] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
141 Y[2] = t;
2234
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:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
145 Luma[0] = Y[0]; Luma[1] = Y[1]; Luma[2] = Y[2]; Luma[3] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
146 Luma[4] = Y[0]; Luma[5] = Y[1]; Luma[6] = Y[2]; Luma[7] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
147 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[2]; Luma[11] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
148 Luma[12] = Y[0]; Luma[13] = Y[1]; Luma[14] = Y[2]; Luma[15] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
149 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
150 case 1:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
151 Luma[0] = Y[1]; Luma[1] = Y[2]; Luma[2] = Y[3]; Luma[3] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
152 Luma[4] = Y[0]; Luma[5] = Y[1]; Luma[6] = Y[2]; Luma[7] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
153 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[2]; Luma[11] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
154 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[1]; Luma[15] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
155 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
156 case 2:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 Luma[0] = Y[1]; Luma[1] = Y[2]; Luma[2] = Y[3]; Luma[3] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
158 Luma[4] = Y[1]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
159 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
160 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[1]; Luma[15] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
161 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
162 case 3:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
163 Luma[0] = Y[2]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
164 Luma[4] = Y[1]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
165 Luma[8] = Y[0]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
166 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
168 case 4:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
169 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
170 Luma[4] = Y[2]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
171 Luma[8] = Y[1]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
172 Luma[12] = Y[0]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
173 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
174 case 5:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
175 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[3]; Luma[3] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
176 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[2]; Luma[7] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
177 Luma[8] = Y[2]; Luma[9] = Y[1]; Luma[10] = Y[1]; Luma[11] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
178 Luma[12] = Y[1]; Luma[13] = Y[0]; Luma[14] = Y[0]; Luma[15] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
179 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
180 case 6:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
181 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[2]; Luma[3] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
182 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[1]; Luma[7] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
183 Luma[8] = Y[2]; Luma[9] = Y[2]; Luma[10] = Y[1]; Luma[11] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
184 Luma[12] = Y[1]; Luma[13] = Y[1]; Luma[14] = Y[0]; Luma[15] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
185 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
186 case 7:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
187 Luma[0] = Y[3]; Luma[1] = Y[3]; Luma[2] = Y[2]; Luma[3] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
188 Luma[4] = Y[3]; Luma[5] = Y[2]; Luma[6] = Y[1]; Luma[7] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
189 Luma[8] = Y[3]; Luma[9] = Y[2]; Luma[10] = Y[1]; Luma[11] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
190 Luma[12] = Y[2]; Luma[13] = Y[1]; Luma[14] = Y[0]; Luma[15] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
191 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
192 default:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
193 Luma[0] = Y[0]; Luma[1] = Y[0]; Luma[2] = Y[1]; Luma[3] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
194 Luma[4] = Y[0]; Luma[5] = Y[0]; Luma[6] = Y[1]; Luma[7] = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
195 Luma[8] = Y[2]; Luma[9] = Y[2]; Luma[10] = Y[3]; Luma[11] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
196 Luma[12] = Y[2]; Luma[13] = Y[2]; Luma[14] = Y[3]; Luma[15] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
197 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
198 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
199
2234
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
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
203 static int ulti_decode_frame(AVCodecContext *avctx,
2234
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 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
227
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
228 while(!done) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
229 int idx;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
230 if(blocks >= s->blocks || y >= s->height)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
231 break;//all blocks decoded
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
232
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
233 idx = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
234 if((idx & 0xF8) == 0x70) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
235 switch(idx) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
236 case 0x70: //change modifier
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
237 modifier = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
238 if(modifier>1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
239 av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
240 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
241 case 0x71: // set uniq flag
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
242 uniq = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
243 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
244 case 0x72: //toggle mode
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
245 mode = !mode;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
246 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
247 case 0x73: //end-of-frame
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
248 done = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
249 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
250 case 0x74: //skip some blocks
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
251 skip = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
252 if ((blocks + skip) >= s->blocks)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
253 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
254 blocks += skip;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
255 x += skip * 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
256 while(x >= s->width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
257 x -= s->width;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
258 y += 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
259 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
260 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
261 default:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
262 av_log(avctx, AV_LOG_INFO, "warning: unknown escape 0x%02X\n", idx);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
263 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
264 } else { //handle one block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
265 int code;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
266 int cf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
267 int angle = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
268 uint8_t Y[4]; // luma samples of block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
269 int tx = 0, ty = 0; //coords of subblock
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
270 int chroma = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
271 if (mode || uniq) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
272 uniq = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
273 cf = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
274 chroma = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
275 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
276 cf = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
277 if (idx)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
278 chroma = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
279 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
280 for (i = 0; i < 4; i++) { // for every subblock
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
281 code = (idx >> (6 - i*2)) & 3; //extract 2 bits
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
282 if(!code) //skip subblock
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
283 continue;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
284 if(cf)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
285 chroma = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
286 tx = x + block_coords[i * 2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
287 ty = y + block_coords[(i * 2) + 1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
288 switch(code) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
289 case 1:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
290 tmp = *buf++;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
291
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
292 angle = angle_by_index[(tmp >> 6) & 0x3];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
293
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
294 Y[0] = tmp & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
295 Y[1] = Y[0];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
296
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
297 if (angle) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
298 Y[2] = Y[0]+1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
299 if (Y[2] > 0x3F)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
300 Y[2] = 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
301 Y[3] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
302 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
303 Y[2] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
304 Y[3] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
305 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
306 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
307
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
308 case 2:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
309 if (modifier) { // unpack four luma samples
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
310 tmp = (*buf++) << 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
311 tmp += (*buf++) << 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
312 tmp += *buf++;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
313
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
314 Y[0] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
315 Y[1] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
316 Y[2] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
317 Y[3] = tmp & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
318 angle = 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
319 } else { // retrieve luma samples from codebook
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
320 tmp = (*buf++) << 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
321 tmp += (*buf++);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
322
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
323 angle = (tmp >> 12) & 0xF;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
324 tmp &= 0xFFF;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
325 tmp <<= 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
326 Y[0] = s->ulti_codebook[tmp];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
327 Y[1] = s->ulti_codebook[tmp + 1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
328 Y[2] = s->ulti_codebook[tmp + 2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
329 Y[3] = s->ulti_codebook[tmp + 3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
330 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
331 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
332
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
333 case 3:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
334 if (modifier) { // all 16 luma samples
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
335 uint8_t Luma[16];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
336
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
337 tmp = (*buf++) << 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
338 tmp += (*buf++) << 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
339 tmp += *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
340 Luma[0] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
341 Luma[1] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
342 Luma[2] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
343 Luma[3] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
344
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
345 tmp = (*buf++) << 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
346 tmp += (*buf++) << 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
347 tmp += *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
348 Luma[4] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
349 Luma[5] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
350 Luma[6] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
351 Luma[7] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
352
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
353 tmp = (*buf++) << 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
354 tmp += (*buf++) << 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
355 tmp += *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
356 Luma[8] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
357 Luma[9] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
358 Luma[10] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
359 Luma[11] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
360
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
361 tmp = (*buf++) << 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
362 tmp += (*buf++) << 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
363 tmp += *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
364 Luma[12] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
365 Luma[13] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
366 Luma[14] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
367 Luma[15] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
368
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
369 ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
370 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
371 tmp = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
372 if(tmp & 0x80) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
373 angle = (tmp >> 4) & 0x7;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
374 tmp = (tmp << 8) + *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
375 Y[0] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
376 Y[1] = tmp & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
377 Y[2] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
378 Y[3] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
379 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); //draw block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
380 } else { // some patterns
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
381 int f0, f1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
382 f0 = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
383 f1 = tmp;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
384 Y[0] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
385 Y[1] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
386 ulti_pattern(&s->frame, tx, ty, f1, f0, Y[0], Y[1], chroma);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
387 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
388 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
389 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
390 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
391 if(code != 3)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
392 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); // draw block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
393 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
394 blocks++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
395 x += 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
396 if(x >= s->width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
397 x = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
398 y += 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
399 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
400 }
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
401 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
402
2234
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