annotate ulti.c @ 6624:2dc587201e38 libavcodec

Change k limiting code, i think the code was buggy. If you have ALAC files TEST them! Mine produce the same md5 but the new code is not identical if limiting does happen.
author michael
date Thu, 17 Apr 2008 03:00:08 +0000
parents 48759bfbd073
children 5b3acf9fd50a
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 /**
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
23 * @file ulti.c
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
24 * IBM Ultimotion Video Decoder.
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
26
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
27 #include <stdio.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
28 #include <stdlib.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
29 #include <string.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
30 #include <unistd.h>
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
31
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
32 #include "avcodec.h"
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
33 #include "bytestream.h"
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
34
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
35 #include "ulti_cb.h"
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
36
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
37 typedef struct UltimotionDecodeContext {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
38 AVCodecContext *avctx;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
39 int width, height, blocks;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
40 AVFrame frame;
2834
fd5d7c732c6b kill a bunch of compiler warnings
mru
parents: 2779
diff changeset
41 const uint8_t *ulti_codebook;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
42 } UltimotionDecodeContext;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
43
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
44 static av_cold int ulti_decode_init(AVCodecContext *avctx)
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
45 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
46 UltimotionDecodeContext *s = avctx->priv_data;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
47
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
48 s->avctx = avctx;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
49 s->width = avctx->width;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
50 s->height = avctx->height;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
51 s->blocks = (s->width / 8) * (s->height / 8);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
52 avctx->pix_fmt = PIX_FMT_YUV410P;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
53 avctx->coded_frame = (AVFrame*) &s->frame;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
54 s->ulti_codebook = ulti_codebook;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
55
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
56 return 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
57 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
58
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
59 static int block_coords[8] = // 4x4 block coords in 8x8 superblock
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
60 { 0, 0, 0, 4, 4, 4, 4, 0};
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
61
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
62 static int angle_by_index[4] = { 0, 2, 6, 12};
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
63
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
64 /* Lookup tables for luma and chroma - used by ulti_convert_yuv() */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
65 static uint8_t ulti_lumas[64] =
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
66 { 0x10, 0x13, 0x17, 0x1A, 0x1E, 0x21, 0x25, 0x28,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
67 0x2C, 0x2F, 0x33, 0x36, 0x3A, 0x3D, 0x41, 0x44,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
68 0x48, 0x4B, 0x4F, 0x52, 0x56, 0x59, 0x5C, 0x60,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
69 0x63, 0x67, 0x6A, 0x6E, 0x71, 0x75, 0x78, 0x7C,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
70 0x7F, 0x83, 0x86, 0x8A, 0x8D, 0x91, 0x94, 0x98,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
71 0x9B, 0x9F, 0xA2, 0xA5, 0xA9, 0xAC, 0xB0, 0xB3,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
72 0xB7, 0xBA, 0xBE, 0xC1, 0xC5, 0xC8, 0xCC, 0xCF,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
73 0xD3, 0xD6, 0xDA, 0xDD, 0xE1, 0xE4, 0xE8, 0xEB};
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
74
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
75 static uint8_t ulti_chromas[16] =
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
76 { 0x60, 0x67, 0x6D, 0x73, 0x7A, 0x80, 0x86, 0x8D,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
77 0x93, 0x99, 0xA0, 0xA6, 0xAC, 0xB3, 0xB9, 0xC0};
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
78
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
79 /* convert Ultimotion YUV block (sixteen 6-bit Y samples and
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
80 two 4-bit chroma samples) into standard YUV and put it into frame */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
81 static void ulti_convert_yuv(AVFrame *frame, int x, int y,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
82 uint8_t *luma,int chroma)
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
83 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
84 uint8_t *y_plane, *cr_plane, *cb_plane;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
85 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
86
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
87 y_plane = frame->data[0] + x + y * frame->linesize[0];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
88 cr_plane = frame->data[1] + (x / 4) + (y / 4) * frame->linesize[1];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
89 cb_plane = frame->data[2] + (x / 4) + (y / 4) * frame->linesize[2];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
90
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
91 cr_plane[0] = ulti_chromas[chroma >> 4];
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 cb_plane[0] = ulti_chromas[chroma & 0xF];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
94
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
95
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
96 for(i = 0; i < 16; i++){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
97 y_plane[i & 3] = ulti_lumas[luma[i]];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
98 if((i & 3) == 3) { //next row
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 y_plane += frame->linesize[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
100 }
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
101 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
102 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
103
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
104 /* generate block like in MS Video1 */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
105 static void ulti_pattern(AVFrame *frame, int x, int y,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
106 int f0, int f1, int Y0, int Y1, int chroma)
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
107 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
108 uint8_t Luma[16];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
109 int mask, i;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
110 for(mask = 0x80, i = 0; mask; mask >>= 1, i++) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
111 if(f0 & mask)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
112 Luma[i] = Y1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
113 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
114 Luma[i] = Y0;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
115 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
116
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
117 for(mask = 0x80, i = 8; mask; mask >>= 1, i++) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
118 if(f1 & mask)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
119 Luma[i] = Y1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 Luma[i] = Y0;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
122 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
123
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
124 ulti_convert_yuv(frame, x, y, Luma, chroma);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
125 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
126
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
127 /* fill block with some gradient */
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
128 static void ulti_grad(AVFrame *frame, int x, int y, uint8_t *Y, int chroma, int angle)
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
129 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
130 uint8_t Luma[16];
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
131 if(angle & 8) { //reverse order
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
132 int t;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
133 angle &= 0x7;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
134 t = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
135 Y[0] = Y[3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 Y[3] = t;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
137 t = Y[1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
138 Y[1] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
139 Y[2] = t;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
140 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
141 switch(angle){
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
142 case 0:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
143 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
144 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
145 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
146 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
147 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
148 case 1:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
149 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
150 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
151 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
152 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
153 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
154 case 2:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
155 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
156 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
157 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
158 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
159 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
160 case 3:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
161 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
162 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
163 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
164 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
165 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
166 case 4:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 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
168 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
169 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
170 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
171 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
172 case 5:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
173 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
174 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
175 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
176 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
177 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
178 case 6:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
179 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
180 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
181 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
182 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
183 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
184 case 7:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
185 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
186 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
187 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
188 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
189 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
190 default:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
191 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
192 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
193 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
194 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
195 break;
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
196 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
197
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
198 ulti_convert_yuv(frame, x, y, Luma, chroma);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
199 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
200
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
201 static int ulti_decode_frame(AVCodecContext *avctx,
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
202 void *data, int *data_size,
6218
michael
parents: 5215
diff changeset
203 const uint8_t *buf, int buf_size)
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
204 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
205 UltimotionDecodeContext *s=avctx->priv_data;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
206 int modifier = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
207 int uniq = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
208 int mode = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
209 int blocks = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
210 int done = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
211 int x = 0, y = 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
212 int i;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
213 int skip;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
214 int tmp;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
215
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
216 if(s->frame.data[0])
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
217 avctx->release_buffer(avctx, &s->frame);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
218
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
219 s->frame.reference = 1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
220 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
221 if(avctx->get_buffer(avctx, &s->frame) < 0) {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
222 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
223 return -1;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
224 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
225
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
226 while(!done) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
227 int idx;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
228 if(blocks >= s->blocks || y >= s->height)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
229 break;//all blocks decoded
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
230
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
231 idx = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
232 if((idx & 0xF8) == 0x70) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
233 switch(idx) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
234 case 0x70: //change modifier
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
235 modifier = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
236 if(modifier>1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
237 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
238 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
239 case 0x71: // set uniq flag
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
240 uniq = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
241 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
242 case 0x72: //toggle mode
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
243 mode = !mode;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
244 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
245 case 0x73: //end-of-frame
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
246 done = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
247 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
248 case 0x74: //skip some blocks
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
249 skip = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
250 if ((blocks + skip) >= s->blocks)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
251 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
252 blocks += skip;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
253 x += skip * 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
254 while(x >= s->width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
255 x -= s->width;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
256 y += 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
257 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
258 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
259 default:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
260 av_log(avctx, AV_LOG_INFO, "warning: unknown escape 0x%02X\n", idx);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
261 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
262 } else { //handle one block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
263 int code;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
264 int cf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
265 int angle = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
266 uint8_t Y[4]; // luma samples of block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
267 int tx = 0, ty = 0; //coords of subblock
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
268 int chroma = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
269 if (mode || uniq) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
270 uniq = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
271 cf = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
272 chroma = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
273 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
274 cf = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
275 if (idx)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
276 chroma = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
277 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
278 for (i = 0; i < 4; i++) { // for every subblock
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
279 code = (idx >> (6 - i*2)) & 3; //extract 2 bits
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
280 if(!code) //skip subblock
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
281 continue;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
282 if(cf)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
283 chroma = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
284 tx = x + block_coords[i * 2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
285 ty = y + block_coords[(i * 2) + 1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
286 switch(code) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
287 case 1:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
288 tmp = *buf++;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
289
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
290 angle = angle_by_index[(tmp >> 6) & 0x3];
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 Y[0] = tmp & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
293 Y[1] = Y[0];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
294
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
295 if (angle) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
296 Y[2] = Y[0]+1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
297 if (Y[2] > 0x3F)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
298 Y[2] = 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
299 Y[3] = Y[2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
300 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
301 Y[2] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
302 Y[3] = Y[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
303 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
304 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
305
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
306 case 2:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
307 if (modifier) { // unpack four luma samples
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
308 tmp = bytestream_get_be24(&buf);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
309
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
310 Y[0] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
311 Y[1] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
312 Y[2] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
313 Y[3] = tmp & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
314 angle = 16;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
315 } else { // retrieve luma samples from codebook
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
316 tmp = bytestream_get_be16(&buf);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
317
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
318 angle = (tmp >> 12) & 0xF;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
319 tmp &= 0xFFF;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
320 tmp <<= 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
321 Y[0] = s->ulti_codebook[tmp];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
322 Y[1] = s->ulti_codebook[tmp + 1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
323 Y[2] = s->ulti_codebook[tmp + 2];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
324 Y[3] = s->ulti_codebook[tmp + 3];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
325 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
326 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
327
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
328 case 3:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
329 if (modifier) { // all 16 luma samples
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
330 uint8_t Luma[16];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
331
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
332 tmp = bytestream_get_be24(&buf);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
333 Luma[0] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
334 Luma[1] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
335 Luma[2] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
336 Luma[3] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
337
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
338 tmp = bytestream_get_be24(&buf);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
339 Luma[4] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
340 Luma[5] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
341 Luma[6] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
342 Luma[7] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
343
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
344 tmp = bytestream_get_be24(&buf);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
345 Luma[8] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
346 Luma[9] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
347 Luma[10] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
348 Luma[11] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
349
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4962
diff changeset
350 tmp = bytestream_get_be24(&buf);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
351 Luma[12] = (tmp >> 18) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
352 Luma[13] = (tmp >> 12) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
353 Luma[14] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
354 Luma[15] = tmp & 0x3F;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
355
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
356 ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
357 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
358 tmp = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
359 if(tmp & 0x80) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
360 angle = (tmp >> 4) & 0x7;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
361 tmp = (tmp << 8) + *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
362 Y[0] = (tmp >> 6) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
363 Y[1] = tmp & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
364 Y[2] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
365 Y[3] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
366 ulti_grad(&s->frame, tx, ty, Y, chroma, angle); //draw block
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
367 } else { // some patterns
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
368 int f0, f1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
369 f0 = *buf++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
370 f1 = tmp;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
371 Y[0] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
372 Y[1] = (*buf++) & 0x3F;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
373 ulti_pattern(&s->frame, tx, ty, f1, f0, Y[0], Y[1], chroma);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
374 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
375 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
376 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
377 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
378 if(code != 3)
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 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
381 blocks++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
382 x += 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
383 if(x >= s->width) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
384 x = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
385 y += 8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
386 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
387 }
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
388 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2834
diff changeset
389
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
390 *data_size=sizeof(AVFrame);
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
391 *(AVFrame*)data= s->frame;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
392
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
393 return buf_size;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
394 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
395
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6218
diff changeset
396 static av_cold int ulti_decode_end(AVCodecContext *avctx)
2234
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
397 {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
398 /* UltimotionDecodeContext *s = avctx->priv_data;*/
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
399
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
400 return 0;
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
401 }
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
402
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
403 AVCodec ulti_decoder = {
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
404 "ultimotion",
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
405 CODEC_TYPE_VIDEO,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
406 CODEC_ID_ULTI,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
407 sizeof(UltimotionDecodeContext),
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
408 ulti_decode_init,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
409 NULL,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
410 ulti_decode_end,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
411 ulti_decode_frame,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
412 CODEC_CAP_DR1,
dff53892ff8a IBM Ultimotion video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff changeset
413 NULL
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