annotate libmpcodecs/native/roqav.c @ 8388:45eb2d4d633c

The detection of a NetWM class window manager hints is tested before the test of a gnome class windomanager hints, since the gnome hints are outdated and replaced by the newer NetWM specification. Newer versions of Gnome support this standard, and therefore the test should be placed before the Gnome test. Windowmaker does not support NetWM and is checked after the NetWM test. In fact the new code should be placed also before the test for IceWM. Regarding other WMs such as KDE, IceWM the change is not tested. patch by Svante Signell <svante.signell@telia.com>
author arpi
date Sat, 07 Dec 2002 01:25:30 +0000
parents e6c8285a4bd8
children 3cf6b963d08b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
1 /*
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
2 RoQ A/V decoder for the MPlayer program
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
3 by Mike Melanson
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
4 based on Dr. Tim Ferguson's RoQ document and accompanying source
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
5 code found at:
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
6 http://www.csse.monash.edu.au/~timf/videocodec.html
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
7 */
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
8
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
9 #include <stdio.h>
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
10 #include <stdlib.h>
6131
e6c8285a4bd8 memset and memcpy were used without #include <string.h> in a few places.
arpi
parents: 5684
diff changeset
11 #include <string.h>
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
12 #include "config.h"
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
13 #include "bswap.h"
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
14 #include "mp_msg.h"
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
15 #include "mp_image.h"
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
16
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
17 #define LE_16(x) (le2me_16(*(unsigned short *)(x)))
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
18 #define LE_32(x) (le2me_32(*(unsigned int *)(x)))
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
19
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
20 #define CLAMP_S16(x) if (x < -32768) x = -32768; \
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
21 else if (x > 32767) x = 32767;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
22 #define SE_16BIT(x) if (x & 0x8000) x -= 0x10000;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
23
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
24 // RoQ chunk types
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
25 #define RoQ_INFO 0x1001
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
26 #define RoQ_QUAD_CODEBOOK 0x1002
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
27 #define RoQ_QUAD_VQ 0x1011
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
28 #define RoQ_SOUND_MONO 0x1020
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
29 #define RoQ_SOUND_STEREO 0x1021
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
30
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
31 #define MAX_ROQ_CODEBOOK_SIZE 256
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
32
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
33 // codebook entry for 2x2 vector
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
34 typedef struct
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
35 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
36 // upper and lower luminance value pairs of 2x2 vector: [y0 y1], [y2 y3]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
37 unsigned short v2_y_u;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
38 unsigned short v2_y_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
39
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
40 // chrominance components
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
41 unsigned char u, v;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
42
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
43 // these variables are for rendering a doublesized 8x8 block; e.g.:
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
44 // v2_y_rows12 = [y0 y0 y1 y1]
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
45 // v2_y_rows34 = [y2 y2 y3 y3]
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
46 unsigned long v2d_y_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
47 unsigned long v2d_y_rows_34;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
48 // ex: v2_u_row1 = [u u]
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
49 // v2_v_row2 = [v v]
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
50 unsigned short v2d_u_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
51 unsigned short v2d_v_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
52
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
53 // maintain separate bytes for the luminance values as well
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
54 unsigned char y0, y1, y2, y3;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
55 } roq_v2_codebook;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
56
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
57 // codebook entry for 4x4 vector
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
58 typedef struct
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
59 {
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
60 unsigned char v2_index[4];
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
61 } roq_v4_codebook;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
62
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
63 typedef struct
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
64 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
65 roq_v2_codebook v2[MAX_ROQ_CODEBOOK_SIZE];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
66 roq_v4_codebook v4[MAX_ROQ_CODEBOOK_SIZE];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
67 mp_image_t *prev_frame;
5684
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
68 uint32_t numframe;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
69 } roqvideo_info;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
70
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
71
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
72 // This function fills in the missing information for a v2 vector after
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
73 // loading the Y, U and V values.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
74 inline void prep_v2(roq_v2_codebook *v2)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
75 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
76 v2->v2_y_u = be2me_16((v2->y0 << 8) | v2->y1);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
77 v2->v2_y_l = be2me_16((v2->y2 << 8) | v2->y3);
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
78
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
79 v2->v2d_y_rows_12 = be2me_32((v2->y0 << 24) | (v2->y0 << 16) |
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
80 (v2->y1 << 8) | v2->y1);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
81 v2->v2d_y_rows_34 = be2me_32((v2->y2 << 24) | (v2->y2 << 16) |
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
82 (v2->y3 << 8) | v2->y3);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
83
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
84 // no reason to swap these for endianness since they're the same bytes
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
85 v2->v2d_u_rows_12 = (v2->u << 8) | v2->u;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
86 v2->v2d_v_rows_12 = (v2->v << 8) | v2->v;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
87 }
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
88
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
89 inline void paint_v2double_block(
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
90 unsigned char *y_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
91 unsigned char *u_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
92 unsigned char *v_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
93 roq_v2_codebook *v2,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
94 unsigned int y_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
95 unsigned int u_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
96 unsigned int v_stride)
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
97 {
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
98 // render the luminance components
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
99 *(unsigned int *)y_plane = v2->v2d_y_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
100 y_plane += y_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
101 *(unsigned int *)y_plane = v2->v2d_y_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
102 y_plane += y_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
103 *(unsigned int *)y_plane = v2->v2d_y_rows_34;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
104 y_plane += y_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
105 *(unsigned int *)y_plane = v2->v2d_y_rows_34;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
106
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
107 // render the color planes
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
108 *(unsigned short *)u_plane = v2->v2d_u_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
109 u_plane += u_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
110 *(unsigned short *)u_plane = v2->v2d_u_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
111
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
112 *(unsigned short *)v_plane = v2->v2d_v_rows_12;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
113 v_plane += v_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
114 *(unsigned short *)v_plane = v2->v2d_v_rows_12;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
115 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
116
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
117 inline void paint_v4_block(
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
118 unsigned char *y_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
119 unsigned char *u_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
120 unsigned char *v_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
121 unsigned int y_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
122 unsigned int u_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
123 unsigned int v_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
124 roq_v2_codebook *v2_a,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
125 roq_v2_codebook *v2_b,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
126 roq_v2_codebook *v2_c,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
127 roq_v2_codebook *v2_d)
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
128 {
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
129 // render luminance components
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
130 ((unsigned short *)y_plane)[0] = v2_a->v2_y_u;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
131 ((unsigned short *)y_plane)[1] = v2_b->v2_y_u;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
132
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
133 y_plane += y_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
134 ((unsigned short *)y_plane)[0] = v2_a->v2_y_l;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
135 ((unsigned short *)y_plane)[1] = v2_b->v2_y_l;
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
136
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
137 y_plane += y_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
138 ((unsigned short *)y_plane)[0] = v2_c->v2_y_u;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
139 ((unsigned short *)y_plane)[1] = v2_d->v2_y_u;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
140
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
141 y_plane += y_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
142 ((unsigned short *)y_plane)[0] = v2_c->v2_y_l;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
143 ((unsigned short *)y_plane)[1] = v2_d->v2_y_l;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
144
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
145 // render the color planes
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
146 u_plane[0] = v2_a->u;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
147 u_plane[1] = v2_b->u;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
148 u_plane += u_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
149 u_plane[0] = v2_c->u;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
150 u_plane[1] = v2_d->u;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
151
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
152 v_plane[0] = v2_a->v;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
153 v_plane[1] = v2_b->v;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
154 v_plane += v_stride;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
155 v_plane[0] = v2_c->v;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
156 v_plane[1] = v2_d->v;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
157 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
158
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
159 // This function copies the 4x4 block from the prev_*_planes to the
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
160 // current *_planes.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
161 inline void copy_4x4_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
162 unsigned char *y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
163 unsigned char *u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
164 unsigned char *v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
165 unsigned char *prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
166 unsigned char *prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
167 unsigned char *prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
168 unsigned int y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
169 unsigned int u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
170 unsigned int v_stride)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
171 {
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
172 int i;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
173
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
174 // copy over the luminance components (4 rows, 1 uint each)
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
175 for (i = 0; i < 4; i++)
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
176 {
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
177 *(unsigned int *)y_plane = *(unsigned int *)prev_y_plane;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
178 y_plane += y_stride;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
179 prev_y_plane += y_stride;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
180 }
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
181
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
182 // copy the chrominance values
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
183 for (i = 0; i < 2; i++)
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
184 {
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
185 *(unsigned short*)u_plane = *(unsigned short*)prev_u_plane;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
186 u_plane += u_stride;
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
187 prev_u_plane += u_stride;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
188 *(unsigned short*)v_plane = *(unsigned short*)prev_v_plane;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
189 v_plane += v_stride;
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
190 prev_v_plane += v_stride;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
191 }
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
192 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
193
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
194 // This function copies the 8x8 block from the prev_*_planes to the
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
195 // current *_planes.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
196 inline void copy_8x8_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
197 unsigned char *y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
198 unsigned char *u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
199 unsigned char *v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
200 unsigned char *prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
201 unsigned char *prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
202 unsigned char *prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
203 unsigned int y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
204 unsigned int u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
205 unsigned int v_stride)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
206 {
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
207 int i;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
208
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
209 // copy over the luminance components (8 rows, 2 uints each)
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
210 for (i = 0; i < 8; i++)
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
211 {
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
212 ((unsigned int *)y_plane)[0] = ((unsigned int *)prev_y_plane)[0];
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
213 ((unsigned int *)y_plane)[1] = ((unsigned int *)prev_y_plane)[1];
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
214 y_plane += y_stride;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
215 prev_y_plane += y_stride;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
216 }
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
217
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
218 // copy the chrominance values
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
219 for (i = 0; i < 4; i++)
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
220 {
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
221 *(unsigned int*)u_plane = *(unsigned int*)prev_u_plane;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
222 u_plane += u_stride;
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
223 prev_u_plane += u_stride;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
224 *(unsigned int*)v_plane = *(unsigned int*)prev_v_plane;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
225 v_plane += v_stride;
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
226 prev_v_plane += v_stride;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
227 }
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
228 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
229
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
230 // This function creates storage space for the vector codebooks.
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
231 void *roq_decode_video_init(void)
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
232 {
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
233 roqvideo_info *info =
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
234 (roqvideo_info *)calloc(sizeof(roqvideo_info), 1);
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
235
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
236 info->prev_frame = NULL;
5684
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
237 info->numframe=0;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
238
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
239 return info;
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
240 }
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
241
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
242 #define EMPTY_ROQ_CODEWORD 0xFFFF0000
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
243
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
244 #define FETCH_NEXT_CODE() \
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
245 if (current_roq_codeword == EMPTY_ROQ_CODEWORD) \
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
246 { \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
247 if (stream_ptr + 2 > encoded_size) \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
248 { \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
249 mp_msg(MSGT_DECVIDEO, MSGL_WARN, \
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
250 "RoQ video: stream pointer just went out of bounds (1)\n"); \
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
251 return; \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
252 } \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
253 current_roq_codeword = (0x0000FFFF) | \
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
254 (encoded[stream_ptr + 0] << 16) | \
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
255 (encoded[stream_ptr + 1] << 24); \
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
256 stream_ptr += 2; \
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
257 } \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
258 roq_code = ((current_roq_codeword >> 30) & 0x03); \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
259 current_roq_codeword <<= 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
260
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
261 #define FETCH_NEXT_ARGUMENT() \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
262 if (stream_ptr + 1 > encoded_size) \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
263 { \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
264 mp_msg(MSGT_DECVIDEO, MSGL_WARN, \
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
265 "RoQ video: stream pointer just went out of bounds (2)\n"); \
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
266 return; \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
267 } \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
268 argument = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
269
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
270 #define CHECK_PREV_FRAME() \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
271 if (!info->prev_frame) \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
272 { \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
273 mp_msg(MSGT_DECVIDEO, MSGL_WARN, \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
274 "RoQ video: can't handle motion vector when there's no previous frame\n"); \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
275 return; \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
276 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
277
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
278 void roq_decode_video(void *context, unsigned char *encoded,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
279 int encoded_size, mp_image_t *mpi)
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
280 {
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
281 roqvideo_info *info = (roqvideo_info *)context;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
282
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
283 int stream_ptr = 0;
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
284 int i, j;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
285 int chunk_length;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
286 int v2_count;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
287 int v4_count;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
288
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
289 int roq_code;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
290 unsigned int current_roq_codeword = EMPTY_ROQ_CODEWORD;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
291 unsigned char argument = 0;
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
292 char mean_motion_x;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
293 char mean_motion_y;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
294 int mx, my; // for calculating the motion vector
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
295
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
296 int mblock_x = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
297 int mblock_y = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
298 int quad8_x, quad8_y; // for pointing to 8x8 blocks in a macroblock
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
299 int quad4_x, quad4_y; // for pointing to 4x4 blocks in an 8x8 block
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
300
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
301 unsigned char *y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
302 unsigned char *u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
303 unsigned char *v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
304 unsigned char *prev_y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
305 unsigned char *prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
306 unsigned char *prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
307 unsigned int y_stride = mpi->stride[0];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
308 unsigned int u_stride = mpi->stride[1];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
309 unsigned int v_stride = mpi->stride[2];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
310
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
311 roq_v4_codebook v4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
312
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
313 // make sure the encoded chunk is of minimal acceptable length
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
314 if (encoded_size < 8)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
315 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
316 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
317 "RoQ video: chunk isn't even 8 bytes long (minimum acceptable length)\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
318 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
319 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
320
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
321 // make sure the resolution checks out
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
322 if ((mpi->width % 16 != 0) || (mpi->height % 16 != 0))
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
323 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
324 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
325 "RoQ video resolution: %d x %d; expected dimensions divisible by 16\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
326 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
327 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
328
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
329 if (LE_16(&encoded[stream_ptr]) == RoQ_QUAD_CODEBOOK)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
330 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
331 stream_ptr += 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
332 chunk_length = LE_32(&encoded[stream_ptr]);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
333 stream_ptr += 4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
334 v4_count = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
335 v2_count = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
336 if (v2_count == 0)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
337 v2_count = 256;
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
338 if ((v4_count == 0) && (v2_count * 6 < chunk_length))
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
339 v4_count = 256;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
340
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
341 // make sure the lengths agree with each other
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
342 if (((v2_count * 6) + (v4_count * 4)) != chunk_length)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
343 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
344 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
345 "RoQ video: encountered quad codebook chunk with weird lengths (1)\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
346 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
347 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
348 if ((v2_count * 6) > (encoded_size - stream_ptr))
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
349 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
350 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
351 "RoQ video: encountered quad codebook chunk with weird lengths (2)\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
352 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
353 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
354
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
355 // load the 2x2 vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
356 for (i = 0; i < v2_count; i++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
357 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
358 info->v2[i].y0 = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
359 info->v2[i].y1 = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
360 info->v2[i].y2 = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
361 info->v2[i].y3 = encoded[stream_ptr++];
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
362 info->v2[i].u = encoded[stream_ptr++];
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
363 info->v2[i].v = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
364 prep_v2(&info->v2[i]);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
365 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
366
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
367 if ((v4_count * 4) > (encoded_size - stream_ptr))
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
368 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
369 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
370 "RoQ video: encountered quad codebook chunk with weird lengths (3)\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
371 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
372 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
373
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
374 // load the 4x4 vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
375 for (i = 0; i < v4_count; i++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
376 {
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
377 info->v4[i].v2_index[0] = encoded[stream_ptr++];
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
378 info->v4[i].v2_index[1] = encoded[stream_ptr++];
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
379 info->v4[i].v2_index[2] = encoded[stream_ptr++];
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
380 info->v4[i].v2_index[3] = encoded[stream_ptr++];
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
381 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
382 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
383
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
384 if (LE_16(&encoded[stream_ptr]) == RoQ_QUAD_VQ)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
385 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
386 stream_ptr += 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
387 chunk_length = LE_32(&encoded[stream_ptr]);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
388 stream_ptr += 4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
389 mean_motion_y = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
390 mean_motion_x = encoded[stream_ptr++];
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
391
5684
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
392 //RoQ reuses its buffers so a transparent block keeps content
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
393 //from 2 frames ago. The only exception is 2'd frame (#1)
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
394 if(info->numframe==1)
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
395 {
5684
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
396 CHECK_PREV_FRAME();
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
397 memcpy(mpi->planes[0], info->prev_frame->planes[0],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
398 mpi->width * mpi->height);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
399 memcpy(mpi->planes[1], info->prev_frame->planes[1],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
400 (mpi->width * mpi->height) / 4);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
401 memcpy(mpi->planes[2], info->prev_frame->planes[2],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
402 (mpi->width * mpi->height) / 4);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
403 }
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
404
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
405 // iterate through the 16x16 macroblocks
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
406 for (mblock_y = 0; mblock_y < mpi->height; mblock_y += 16)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
407 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
408 for (mblock_x = 0; mblock_x < mpi->width; mblock_x += 16)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
409 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
410 // iterate through the 4 quadrants of the macroblock
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
411 for (i = 0; i < 4; i++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
412 {
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
413 quad8_x = mblock_x;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
414 quad8_y = mblock_y;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
415 if (i & 0x01) quad8_x += 8;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
416 if (i & 0x02) quad8_y += 8;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
417
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
418 // set up the planes
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
419 y_plane = mpi->planes[0] + quad8_y * y_stride + quad8_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
420 u_plane = mpi->planes[1] + (quad8_y / 2) * u_stride + (quad8_x / 2);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
421 v_plane = mpi->planes[2] + (quad8_y / 2) * v_stride + (quad8_x / 2);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
422
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
423 // decide how to handle this 8x8 quad
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
424 FETCH_NEXT_CODE();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
425 switch(roq_code)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
426 {
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
427 // 8x8 block is the same as in the previous frame;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
428 // skip it
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
429 case 0:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
430 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
431
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
432 // 8x8 block is painted with an 8x8 block from the last frame
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
433 // (i.e., motion compensation)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
434 case 1:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
435 CHECK_PREV_FRAME();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
436
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
437 // prepare the pointers to the planes in the previous frame
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
438 FETCH_NEXT_ARGUMENT(); // argument contains motion vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
439
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
440 // figure out the motion vectors
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
441 mx = quad8_x + 8 - (argument >> 4) - mean_motion_x;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
442 my = quad8_y + 8 - (argument & 0x0F) - mean_motion_y;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
443
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
444 prev_y_plane = info->prev_frame->planes[0] +
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
445 my * y_stride + mx;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
446 prev_u_plane = info->prev_frame->planes[1] +
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
447 (my / 2) * u_stride + (mx + 1) / 2;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
448 prev_v_plane = info->prev_frame->planes[2] +
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
449 (my / 2) * v_stride + (mx + 1) / 2;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
450
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
451 // sanity check before rendering
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
452 copy_8x8_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
453 y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
454 u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
455 v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
456 prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
457 prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
458 prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
459 y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
460 u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
461 v_stride
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
462 );
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
463 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
464
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
465 // 8x8 block is painted with a doublesized 4x4 vector
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
466 case 2:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
467 FETCH_NEXT_ARGUMENT();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
468 v4 = info->v4[argument];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
469
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
470 // sanity check before rendering
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
471 // iterate through 4 4x4 blocks
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
472 for (j = 0; j < 4; j++)
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
473 {
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
474 quad4_x = quad8_x;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
475 quad4_y = quad8_y;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
476 if (j & 0x01) quad4_x += 4;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
477 if (j & 0x02) quad4_y += 4;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
478
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
479 // set up the planes
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
480 y_plane = mpi->planes[0] + quad4_y * y_stride + quad4_x;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
481 u_plane = mpi->planes[1] +
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
482 (quad4_y / 2) * u_stride + (quad4_x / 2);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
483 v_plane = mpi->planes[2] +
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
484 (quad4_y / 2) * v_stride + (quad4_x / 2);
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
485
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
486 paint_v2double_block(
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
487 y_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
488 u_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
489 v_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
490 &info->v2[v4.v2_index[j]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
491 y_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
492 u_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
493 v_stride
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
494 );
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
495 }
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
496 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
497
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
498 // 8x8 block is broken down into 4 4x4 blocks and painted using
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
499 // 4 different codes.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
500 case 3:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
501 // iterate through 4 4x4 blocks
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
502 for (j = 0; j < 4; j++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
503 {
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
504 quad4_x = quad8_x;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
505 quad4_y = quad8_y;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
506 if (j & 0x01) quad4_x += 4;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
507 if (j & 0x02) quad4_y += 4;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
508
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
509 // set up the planes
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
510 y_plane = mpi->planes[0] + quad4_y * y_stride + quad4_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
511 u_plane = mpi->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
512 (quad4_y / 2) * u_stride + (quad4_x / 2);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
513 v_plane = mpi->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
514 (quad4_y / 2) * v_stride + (quad4_x / 2);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
515
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
516 // decide how to handle this 4x4 quad
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
517 FETCH_NEXT_CODE();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
518 switch(roq_code)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
519 {
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
520 // 4x4 block is the same as in the previous frame;
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
521 // skip it
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
522 case 0:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
523 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
524
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
525 // 4x4 block is motion compensated from the previous frame
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
526 case 1:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
527 CHECK_PREV_FRAME();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
528 // prepare the pointers to the planes in the previous frame
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
529 FETCH_NEXT_ARGUMENT(); // argument contains motion vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
530
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
531 // figure out the motion vectors
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
532 mx = quad4_x + 8 - (argument >> 4) - mean_motion_x;
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
533 my = quad4_y + 8 - (argument & 0x0F) - mean_motion_y;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
534
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
535 prev_y_plane = info->prev_frame->planes[0] +
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
536 my * y_stride + mx;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
537 prev_u_plane = info->prev_frame->planes[1] +
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
538 (my / 2) * u_stride + (mx + 1) / 2;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
539 prev_v_plane = info->prev_frame->planes[2] +
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
540 (my / 2) * u_stride + (mx + 1) / 2;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
541
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
542 // sanity check before rendering
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
543 copy_4x4_block(
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
544 y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
545 u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
546 v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
547 prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
548 prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
549 prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
550 y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
551 u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
552 v_stride
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
553 );
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
554 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
555
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
556 // 4x4 block is copied directly from v4 vector table
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
557 case 2:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
558 FETCH_NEXT_ARGUMENT();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
559 v4 = info->v4[argument];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
560
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
561 paint_v4_block(
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
562 y_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
563 u_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
564 v_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
565 y_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
566 u_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
567 v_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
568 &info->v2[v4.v2_index[0]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
569 &info->v2[v4.v2_index[1]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
570 &info->v2[v4.v2_index[2]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
571 &info->v2[v4.v2_index[3]]);
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
572 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
573
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
574 // 4x4 block is built from 4 2x2 vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
575 case 3:
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
576 if (stream_ptr + 4 > encoded_size)
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
577 {
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
578 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
579 "RoQ video: stream pointer just went out of bounds (2)\n");
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
580 return;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
581 }
5182
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
582 paint_v4_block(
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
583 y_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
584 u_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
585 v_plane,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
586 y_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
587 u_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
588 v_stride,
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
589 &info->v2[encoded[stream_ptr + 0]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
590 &info->v2[encoded[stream_ptr + 1]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
591 &info->v2[encoded[stream_ptr + 2]],
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
592 &info->v2[encoded[stream_ptr + 3]]);
11f440fa5ee9 the RoQ video decoder is so very close to working, I can almost taste it
melanson
parents: 5079
diff changeset
593 stream_ptr += 4;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
594 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
595 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
596 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
597 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
598 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
599 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
600 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
601 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
602 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
603
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
604 // one last sanity check on the way out
5079
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
605 // (apparently, it's not unusual to have 2 bytes left over after decode)
6cba3ca983b5 RoQ video decoder is much closer to being categorized as "working" (there
melanson
parents: 4936
diff changeset
606 if (stream_ptr < encoded_size - 2)
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
607 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
608 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
609 "RoQ video: completed frame decode with bytes left over (%d < %d)\n",
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
610 stream_ptr, encoded_size);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
611 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
612
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
613 // save the current frame as the previous frame for the next iteration
5684
47daf6075bc6 fixed block artefacts and speedup at the same time
iive
parents: 5602
diff changeset
614 info->numframe++;
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
615 info->prev_frame = mpi;
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
616 }
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
617
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
618 // Initialize the RoQ audio decoder, which is to say, initialize the table
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
619 // of squares.
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
620 void *roq_decode_audio_init(void)
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
621 {
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
622 short *square_array;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
623 short square;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
624 int i;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
625
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
626 square_array = (short *)malloc(256 * sizeof(short));
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
627 if (!square_array)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
628 return NULL;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
629
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
630 for (i = 0; i < 128; i++)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
631 {
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
632 square = i * i;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
633 square_array[i] = square;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
634 square_array[i + 128] = -square;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
635 }
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
636
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
637 return square_array;
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
638 }
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
639
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
640 int roq_decode_audio(
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
641 unsigned short *output,
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
642 unsigned char *input,
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
643 int encoded_size,
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
644 int channels,
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
645 void *context)
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
646 {
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
647 short *square_array = (short *)context;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
648 int i;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
649 int predictor[2];
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
650 int channel_number = 0;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
651
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
652 // prepare the initial predictors
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
653 if (channels == 1)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
654 predictor[0] = LE_16(&input[0]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
655 else
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
656 {
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
657 predictor[0] = input[1] << 8;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
658 predictor[1] = input[0] << 8;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
659 }
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
660 SE_16BIT(predictor[0]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
661 SE_16BIT(predictor[1]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
662
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
663 // decode the samples
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
664 for (i = 2; i < encoded_size; i++)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
665 {
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
666 predictor[channel_number] += square_array[input[i]];
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
667 CLAMP_S16(predictor[channel_number]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
668 output[i - 2] = predictor[channel_number];
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
669
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
670 // toggle channel
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
671 channel_number ^= channels - 1;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
672 }
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
673
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
674 // return the number of samples decoded
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
675 return (encoded_size - 2);
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
676 }