annotate roqav.c @ 4968:236b06410b03

vfw, vfwex, odivx, divx4 added
author arpi
date Thu, 07 Mar 2002 00:44:58 +0000
parents 026329111b09
children 6cba3ca983b5
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 /*
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
2 RoQ A/V decoder for the MPlayer program
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
3 by Mike Melanson
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
4 based on Dr. Tim Ferguson's RoQ document and accompanying source
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
5 code found at:
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
6 http://www.csse.monash.edu.au/~timf/videocodec.html
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>
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
11 #include "config.h"
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
12 #include "bswap.h"
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
13 #include "mp_msg.h"
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
14 #include "mp_image.h"
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
15
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
16 #define LE_16(x) (le2me_16(*(unsigned short *)(x)))
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
17 #define LE_32(x) (le2me_32(*(unsigned int *)(x)))
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
18
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
19 #define CLAMP_S16(x) if (x < -32768) x = -32768; \
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
20 else if (x > 32767) x = 32767;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
21 #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
22
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
23 // RoQ chunk types
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
24 #define RoQ_INFO 0x1001
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
25 #define RoQ_QUAD_CODEBOOK 0x1002
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
26 #define RoQ_QUAD_VQ 0x1011
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
27 #define RoQ_SOUND_MONO 0x1020
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
28 #define RoQ_SOUND_STEREO 0x1021
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
29
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
30 #define MAX_ROQ_CODEBOOK_SIZE 256
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
31
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
32 // codebook entry for 2x2 vector
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
33 typedef struct
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
34 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
35 // 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
36 unsigned short v2_y_u;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
37 unsigned short v2_y_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
38
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
39 // chrominance components
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
40 unsigned char u, v;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
41
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
42 // 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
43 unsigned char y0, y1, y2, y3;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
44 } roq_v2_codebook;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
45
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
46 // codebook entry for 4x4 vector
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
47 typedef struct
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
48 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
49 // these variables are for rendering a 4x4 block built from 4 2x2
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
50 // vectors [va vb vc vd]; e.g.:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
51 // v4_y_row1 = [va.y0 va.y1 vb.y0 vb.y1]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
52 // v4_y_row4 = [vc.y2 vc.y3 vd.y2 vd.y3]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
53 unsigned long v4_y_row1;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
54 unsigned long v4_y_row2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
55 unsigned long v4_y_row3;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
56 unsigned long v4_y_row4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
57 // ex: v4_u_row1 = [va.u vb.u]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
58 // v4_u_row2 = [vc.u vd.u]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
59 unsigned short v4_u_row1;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
60 unsigned short v4_u_row2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
61 unsigned short v4_v_row1;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
62 unsigned short v4_v_row2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
63
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
64 // these variables are for rendering a 4x4 block doublesized to an
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
65 // 8x8 block
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
66 // ex: v4d_y_rows_12_l contains the 4 luminance values used to paint
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
67 // the left half (4 pixels) of rows 1 and 2 of the 8x8 block, which
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
68 // will be comprised from the original 2x2 vectors as
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
69 // [va.y0 va.y0 va.y1 va.y1]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
70 unsigned long v4d_y_rows_12_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
71 unsigned long v4d_y_rows_12_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
72 unsigned long v4d_y_rows_34_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
73 unsigned long v4d_y_rows_34_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
74 unsigned long v4d_y_rows_56_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
75 unsigned long v4d_y_rows_56_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
76 unsigned long v4d_y_rows_78_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
77 unsigned long v4d_y_rows_78_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
78 // doublesized chrominance values
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
79 // ex: v4d_u_rows_12 = [va.u va.u vb.u vb.u]
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
80 unsigned long v4d_u_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
81 unsigned long v4d_u_rows_34;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
82 unsigned long v4d_v_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
83 unsigned long v4d_v_rows_34;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
84 } roq_v4_codebook;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
85
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
86 typedef struct
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
87 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
88 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
89 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
90 mp_image_t *prev_frame;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
91 } roqvideo_info;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
92
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
93
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
94 // 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
95 // 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
96 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
97 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
98 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
99 v2->v2_y_l = be2me_16((v2->y2 << 8) | v2->y3);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
100 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
101
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
102 // This function fills in the missing information for a v4 vector based
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
103 // on 4 v2 indices.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
104 void prep_v4(roq_v4_codebook *v4,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
105 roq_v2_codebook *v2_a, roq_v2_codebook *v2_b,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
106 roq_v2_codebook *v2_c, roq_v2_codebook *v2_d)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
107 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
108 // fill in the v4 variables
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
109 v4->v4_y_row1 = be2me_32((v2_a->v2_y_u << 16) | v2_b->v2_y_u);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
110 v4->v4_y_row2 = be2me_32((v2_a->v2_y_l << 16) | v2_b->v2_y_l);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
111 v4->v4_y_row3 = be2me_32((v2_c->v2_y_u << 16) | v2_d->v2_y_u);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
112 v4->v4_y_row4 = be2me_32((v2_c->v2_y_l << 16) | v2_d->v2_y_l);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
113
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
114 v4->v4_u_row1 = be2me_16((v2_a->u << 8) | v2_b->u);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
115 v4->v4_u_row2 = be2me_16((v2_c->u << 8) | v2_d->u);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
116
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
117 v4->v4_v_row1 = be2me_16((v2_a->v << 8) | v2_b->v);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
118 v4->v4_v_row2 = be2me_16((v2_c->v << 8) | v2_d->v);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
119
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
120 // fill in the doublesized v4 variables
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
121 v4->v4d_y_rows_12_l = be2me_32((v2_a->y0 << 24) | (v2_a->y0 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
122 (v2_a->y1 << 8) | v2_a->y1);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
123 v4->v4d_y_rows_12_r = be2me_32((v2_b->y0 << 24) | (v2_b->y0 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
124 (v2_b->y1 << 8) | v2_b->y1);
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
125
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
126 v4->v4d_y_rows_34_l = be2me_32((v2_a->y2 << 24) | (v2_a->y2 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
127 (v2_a->y3 << 8) | v2_a->y3);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
128 v4->v4d_y_rows_34_r = be2me_32((v2_b->y2 << 24) | (v2_b->y2 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
129 (v2_b->y3 << 8) | v2_b->y3);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
130
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
131 v4->v4d_y_rows_56_l = be2me_32((v2_c->y0 << 24) | (v2_c->y0 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
132 (v2_c->y1 << 8) | v2_c->y1);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
133 v4->v4d_y_rows_56_r = be2me_32((v2_d->y0 << 24) | (v2_d->y0 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
134 (v2_d->y1 << 8) | v2_d->y1);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
135
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
136 v4->v4d_y_rows_78_l = be2me_32((v2_c->y2 << 24) | (v2_c->y2 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
137 (v2_d->y3 << 8) | v2_d->y3);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
138 v4->v4d_y_rows_78_r = be2me_32((v2_c->y2 << 24) | (v2_c->y2 << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
139 (v2_d->y3 << 8) | v2_d->y3);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
140
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
141 v4->v4d_u_rows_12 = be2me_32((v2_a->u << 24) | (v2_a->u << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
142 (v2_b->u << 8) | v2_b->u);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
143 v4->v4d_u_rows_34 = be2me_32((v2_c->u << 24) | (v2_c->u << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
144 (v2_d->u << 8) | v2_d->u);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
145
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
146 v4->v4d_v_rows_12 = be2me_32((v2_a->v << 24) | (v2_a->v << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
147 (v2_b->v << 8) | v2_b->v);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
148 v4->v4d_v_rows_34 = be2me_32((v2_c->v << 24) | (v2_c->v << 16) |
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
149 (v2_d->v << 8) | v2_d->v);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
150 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
151
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
152 // 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
153 // current *_planes.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
154 inline void copy_4x4_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
155 unsigned char *y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
156 unsigned char *u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
157 unsigned char *v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
158 unsigned char *prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
159 unsigned char *prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
160 unsigned char *prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
161 unsigned int y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
162 unsigned int u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
163 unsigned int v_stride)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
164 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
165 // copy over the luminance components
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
166 *(unsigned int *)y_plane = *(unsigned int *)prev_y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
167 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
168 prev_y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
169 *(unsigned int *)y_plane = *(unsigned int *)prev_y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
170 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
171 prev_y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
172 *(unsigned int *)y_plane = *(unsigned int *)prev_y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
173 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
174 prev_y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
175 *(unsigned int *)y_plane = *(unsigned int *)prev_y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
176
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
177 // copy the chrominance values
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
178 *(unsigned short*)u_plane = *(unsigned short*)prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
179 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
180 *(unsigned short*)u_plane = *(unsigned short*)prev_u_plane;
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 *(unsigned short*)v_plane = *(unsigned short*)prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
183 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
184 *(unsigned short*)v_plane = *(unsigned short*)prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
185 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
186
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
187 // 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
188 // current *_planes.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
189 inline void copy_8x8_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
190 unsigned char *y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
191 unsigned char *u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
192 unsigned char *v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
193 unsigned char *prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
194 unsigned char *prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
195 unsigned char *prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
196 unsigned int y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
197 unsigned int u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
198 unsigned int v_stride)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
199 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
200 // copy over the luminance components
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
201 ((unsigned int *)y_plane)[0] = ((unsigned int *)prev_y_plane)[0];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
202 ((unsigned int *)y_plane)[1] = ((unsigned int *)prev_y_plane)[1];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
203
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
204 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
205 prev_y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
206 ((unsigned int *)y_plane)[0] = ((unsigned int *)prev_y_plane)[0];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
207 ((unsigned int *)y_plane)[1] = ((unsigned int *)prev_y_plane)[1];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
208
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
209 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
210 prev_y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
211 ((unsigned int *)y_plane)[0] = ((unsigned int *)prev_y_plane)[0];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
212 ((unsigned int *)y_plane)[1] = ((unsigned int *)prev_y_plane)[1];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
213
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
214 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
215 prev_y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
216 ((unsigned int *)y_plane)[0] = ((unsigned int *)prev_y_plane)[0];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
217 ((unsigned int *)y_plane)[1] = ((unsigned int *)prev_y_plane)[1];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
218
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
219 // copy the chrominance values
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
220 *(unsigned int*)u_plane = *(unsigned int*)prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
221 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
222 *(unsigned int*)u_plane = *(unsigned int*)prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
223 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
224 *(unsigned int*)u_plane = *(unsigned int*)prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
225 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
226 *(unsigned int*)u_plane = *(unsigned int*)prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
227
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
228 *(unsigned int*)v_plane = *(unsigned int*)prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
229 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
230 *(unsigned int*)v_plane = *(unsigned int*)prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
231 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
232 *(unsigned int*)v_plane = *(unsigned int*)prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
233 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
234 *(unsigned int*)v_plane = *(unsigned int*)prev_v_plane;
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
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
237 // 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
238 void *roq_decode_video_init(void)
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
239 {
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
240 roqvideo_info *info =
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
241 (roqvideo_info *)malloc(sizeof(roqvideo_info));
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
242
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
243 info->prev_frame = NULL;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
244
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
245 return info;
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
246 }
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
247
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
248 #define FETCH_NEXT_CODE() \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
249 if (current_roq_codeword == 0xFFFF0000) \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
250 { \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
251 if (stream_ptr + 2 > encoded_size) \
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 mp_msg(MSGT_DECVIDEO, MSGL_WARN, \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
254 "RoQ video: stream pointer just went out of bounds\n"); \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
255 return; \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
256 } \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
257 current_roq_codeword = (0x0000FFFF) | \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
258 (encoded[stream_ptr++] << 16) | \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
259 (encoded[stream_ptr++] << 24); \
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 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
262 current_roq_codeword <<= 2;
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 //printf (" %d\n", roq_code);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
265
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
266 #define FETCH_NEXT_ARGUMENT() \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
267 if (stream_ptr + 1 > encoded_size) \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
268 { \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
269 mp_msg(MSGT_DECVIDEO, MSGL_WARN, \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
270 "RoQ video: stream pointer just went out of bounds\n"); \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
271 return; \
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 argument = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
274
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
275 #define CHECK_PREV_FRAME() \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
276 if (!info->prev_frame) \
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 mp_msg(MSGT_DECVIDEO, MSGL_WARN, \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
279 "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
280 return; \
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
281 }
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
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
284 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
285 int encoded_size, mp_image_t *mpi)
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
286 {
4936
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
287 roqvideo_info *info = (roqvideo_info *)context;
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 stream_ptr = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
290 int i, j, k;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
291 int chunk_length;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
292 int v2_count;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
293 int v4_count;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
294 int v2_ia, v2_ib, v2_ic, v2_id;
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 roq_code;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
297 unsigned int current_roq_codeword = 0xFFFF0000;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
298 unsigned char argument = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
299 int mean_motion_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
300 int mean_motion_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
301 int dx_y, dy_y; // for calculating the motion vector
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
302 int dx_c, dy_c; // motion vector for chrominance components
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
303
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
304 int mblock_x = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
305 int mblock_y = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
306 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
307 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
308 int quad2_x, quad2_y; // for pointing to 2x2 blocks in a 4x4 block
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
309
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
310 unsigned char *y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
311 unsigned char *u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
312 unsigned char *v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
313 unsigned char *prev_y_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
314 unsigned char *prev_u_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
315 unsigned char *prev_v_plane;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
316 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
317 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
318 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
319
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
320 roq_v4_codebook v4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
321 roq_v2_codebook v2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
322
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 static int counter = 0;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
325 //printf ("frame %d\n", counter++);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
326
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 // 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
329 if (encoded_size < 8)
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 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
332 "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
333 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
334 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
335
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
336 // make sure the resolution checks out
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
337 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
338 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
339 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
340 "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
341 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
342 }
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 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
345 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
346 printf ("parsing codebook\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
347 stream_ptr += 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
348 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
349 stream_ptr += 4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
350 v4_count = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
351 if (v4_count == 0)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
352 v4_count = 256;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
353 v2_count = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
354 if (v2_count == 0)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
355 v2_count = 256;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
356
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
357 // 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
358 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
359 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
360 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
361 "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
362 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
363 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
364 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
365 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
366 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
367 "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
368 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
369 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
370
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
371 // load the 2x2 vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
372 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
373 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
374 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
375 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
376 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
377 info->v2[i].y3 = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
378 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
379 info->v2[i].u = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
380 prep_v2(&info->v2[i]);
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 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
384 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
385 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
386 "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
387 return;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
388 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
389
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
390 // load the 4x4 vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
391 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
392 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
393 v2_ia = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
394 v2_ib = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
395 v2_ic = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
396 v2_id = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
397 prep_v4(&info->v4[i], &info->v2[v2_ia], &info->v2[v2_ib],
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
398 &info->v2[v2_ic], &info->v2[v2_id]);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
399 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
400 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
401
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
402 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
403 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
404 printf ("parsing quad vq\n");
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
405 stream_ptr += 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
406 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
407 stream_ptr += 4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
408 mean_motion_y = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
409 mean_motion_x = encoded[stream_ptr++];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
410
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
411 // iterate through the 16x16 macroblocks
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
412 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
413 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
414 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
415 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
416 quad8_x = mblock_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
417 quad8_y = mblock_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
418
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
419 // 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
420 for (i = 0; i < 4; i++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
421 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
422 if (quad8_x & 8)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
423 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
424 quad8_x -= 8;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
425 quad8_y += 8;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
426 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
427 else
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
428 quad8_x += 8;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
429
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
430 // set up the planes
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
431 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
432 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
433 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
434
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
435 // 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
436 FETCH_NEXT_CODE();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
437 switch(roq_code)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
438 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
439 // 8x8 block is painted with the same block as the last frame
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
440 case 0:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
441 CHECK_PREV_FRAME();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
442 // 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
443 prev_y_plane = info->prev_frame->planes[0] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
444 quad8_y * y_stride + quad8_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
445 prev_u_plane = info->prev_frame->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
446 (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
447 prev_v_plane = info->prev_frame->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
448 (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
449
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
450 // sanity check before rendering
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
451 copy_8x8_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
452 y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
453 u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
454 v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
455 prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
456 prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
457 prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
458 y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
459 u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
460 v_stride
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
461 );
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 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
466 // (i.e., motion compensation)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
467 case 1:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
468 CHECK_PREV_FRAME();
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 // 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
471 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
472
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
473 // figure out the motion vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
474 dx_y = quad8_x + 8 - (argument >> 4) - mean_motion_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
475 dy_y = quad8_y + 8 - (argument & 0x0F) - mean_motion_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
476 dx_c = (quad8_x + 8) / 2 - (argument >> 4) - mean_motion_x / 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
477 dy_c = (quad8_y + 8) / 2 - (argument & 0x0F) - mean_motion_y / 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
478
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
479 prev_y_plane = info->prev_frame->planes[0] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
480 dy_y * y_stride + dx_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
481 prev_u_plane = info->prev_frame->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
482 dy_c * u_stride + dx_c;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
483 prev_v_plane = info->prev_frame->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
484 dy_c * v_stride + dx_c;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
485
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
486 // sanity check before rendering
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
487 copy_8x8_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
488 y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
489 u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
490 v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
491 prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
492 prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
493 prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
494 y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
495 u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
496 v_stride
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
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
499 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
500
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
501 // 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
502 case 2:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
503 FETCH_NEXT_ARGUMENT();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
504 v4 = info->v4[argument];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
505
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
506 // sanity check before rendering
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
507 // take care of the 8 luminance rows
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
508 ((unsigned int*)y_plane)[0] = v4.v4d_y_rows_12_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
509 ((unsigned int*)y_plane)[1] = v4.v4d_y_rows_12_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
510
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
511 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
512 ((unsigned int*)y_plane)[0] = v4.v4d_y_rows_34_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
513 ((unsigned int*)y_plane)[1] = v4.v4d_y_rows_34_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
514
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
515 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
516 ((unsigned int*)y_plane)[0] = v4.v4d_y_rows_56_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
517 ((unsigned int*)y_plane)[1] = v4.v4d_y_rows_56_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
518
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
519 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
520 ((unsigned int*)y_plane)[0] = v4.v4d_y_rows_78_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
521 ((unsigned int*)y_plane)[1] = v4.v4d_y_rows_78_r;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
522
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
523 // then the 4 U & V chrominance rows
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
524 *(unsigned int*)u_plane = v4.v4d_u_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
525 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
526 *(unsigned int*)u_plane = v4.v4d_u_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
527 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
528 *(unsigned int*)u_plane = v4.v4d_u_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
529 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
530 *(unsigned int*)u_plane = v4.v4d_u_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
531
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
532 *(unsigned int*)v_plane = v4.v4d_v_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
533 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
534 *(unsigned int*)v_plane = v4.v4d_v_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
535 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
536 *(unsigned int*)v_plane = v4.v4d_v_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
537 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
538 *(unsigned int*)v_plane = v4.v4d_v_rows_12;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
539
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
540 break;
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 // 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
543 // 4 different codes.
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
544 case 3:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
545 quad4_x = quad8_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
546 quad4_y = quad8_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
547
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
548 // iterate through 4 4x4 blocks
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
549 for (j = 0; j < 4; j++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
550 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
551 if (quad4_x & 4)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
552 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
553 quad4_x -= 4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
554 quad4_y += 4;
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 else
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
557 quad4_x += 4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
558
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
559 // set up the planes
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
560 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
561 u_plane = mpi->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
562 (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
563 v_plane = mpi->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
564 (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
565
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
566 // 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
567 FETCH_NEXT_CODE();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
568 switch(roq_code)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
569 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
570 // 4x4 block is the same as in the previous frame
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
571 case 0:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
572 CHECK_PREV_FRAME();
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 // 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
575 prev_y_plane = info->prev_frame->planes[0] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
576 quad4_y * y_stride + quad4_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
577 prev_u_plane = info->prev_frame->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
578 (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
579 prev_v_plane = info->prev_frame->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
580 (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
581
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
582 // sanity check before rendering
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
583 copy_4x4_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
584 y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
585 u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
586 v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
587 prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
588 prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
589 prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
590 y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
591 u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
592 v_stride
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
593 );
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
594
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
595 break;
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 // 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
598 case 1:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
599 CHECK_PREV_FRAME();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
600 // 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
601 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
602
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
603 // figure out the motion vectors
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
604 dx_y = quad4_x + 4 - (argument >> 4) - mean_motion_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
605 dy_y = quad4_y + 4 - (argument & 0x0F) - mean_motion_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
606 dx_c = (quad4_x + 4) / 2 - (argument >> 4) -
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
607 mean_motion_x / 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
608 dy_c = (quad4_y + 4) / 2 - (argument & 0x0F) -
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
609 mean_motion_y / 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
610
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
611 prev_y_plane = info->prev_frame->planes[0] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
612 dy_y * y_stride + dx_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
613 prev_u_plane = info->prev_frame->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
614 dy_c * u_stride + dx_c;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
615 prev_v_plane = info->prev_frame->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
616 dy_c * v_stride + dx_c;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
617
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
618 // sanity check before rendering
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
619 copy_8x8_block(
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
620 y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
621 u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
622 v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
623 prev_y_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
624 prev_u_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
625 prev_v_plane,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
626 y_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
627 u_stride,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
628 v_stride
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
629 );
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
630
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
631 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
632
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
633 // 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
634 case 2:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
635 FETCH_NEXT_ARGUMENT();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
636 v4 = info->v4[argument];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
637
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
638 // copy the 4 luminance rows
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
639 *(unsigned int*)y_plane = v4.v4_y_row1;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
640 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
641 *(unsigned int*)y_plane = v4.v4_y_row2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
642 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
643 *(unsigned int*)y_plane = v4.v4_y_row3;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
644 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
645 *(unsigned int*)y_plane = v4.v4_y_row4;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
646
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
647 // copy the U & V chrominance rows
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
648 *(unsigned short*)u_plane = v4.v4_u_row1;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
649 u_plane += u_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
650 *(unsigned short*)u_plane = v4.v4_u_row2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
651
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
652 *(unsigned short*)v_plane = v4.v4_v_row1;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
653 v_plane += v_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
654 *(unsigned short*)v_plane = v4.v4_v_row2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
655
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
656 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
657
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
658 // 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
659 case 3:
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
660 quad2_x = quad4_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
661 quad2_y = quad4_y;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
662
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
663 // iterate through 4 2x2 blocks
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
664 for (k = 0; k < 4; k++)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
665 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
666 if (quad2_x & 2)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
667 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
668 quad2_x -= 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
669 quad2_y += 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
670 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
671 else
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
672 quad2_x += 2;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
673
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
674 // set up the planes
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
675 y_plane = mpi->planes[0] + quad2_y * y_stride + quad2_x;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
676 u_plane = mpi->planes[1] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
677 (quad2_y / 2) * u_stride + (quad2_x / 2);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
678 v_plane = mpi->planes[2] +
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
679 (quad2_y / 2) * v_stride + (quad2_x / 2);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
680
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
681 // fetch the next index into the v2 vector table
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
682 FETCH_NEXT_ARGUMENT();
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
683 v2 = info->v2[argument];
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
684
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
685 // copy the luminance components
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
686 *(unsigned short*)y_plane = v2.v2_y_u;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
687 y_plane += y_stride;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
688 *(unsigned short*)y_plane = v2.v2_y_l;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
689
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
690 // copy the U and V bytes
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
691 u_plane[0] = v2.u;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
692 v_plane[0] = v2.v;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
693 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
694
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
695 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
696 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
697 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
698 break;
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
699 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
700 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
701 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
702 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
703 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
704
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
705 // one last sanity check on the way out
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
706 if (stream_ptr < encoded_size)
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
707 {
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
708 mp_msg(MSGT_DECVIDEO, MSGL_WARN,
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
709 "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
710 stream_ptr, encoded_size);
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
711 }
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
712
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
713 // save the current frame as the previous frame for the next iteration
026329111b09 first pass at RoQ video decoder...not exactly qualified as 'working' at
melanson
parents: 4486
diff changeset
714 info->prev_frame = mpi;
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
715 }
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
716
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
717 // 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
718 // of squares.
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
719 void *roq_decode_audio_init(void)
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
720 {
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
721 short *square_array;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
722 short square;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
723 int i;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
724
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
725 square_array = (short *)malloc(256 * sizeof(short));
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
726 if (!square_array)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
727 return NULL;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
728
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
729 for (i = 0; i < 128; i++)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
730 {
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
731 square = i * i;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
732 square_array[i] = square;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
733 square_array[i + 128] = -square;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
734 }
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
735
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
736 return square_array;
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
737 }
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
738
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
739 int roq_decode_audio(
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
740 unsigned short *output,
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
741 unsigned char *input,
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
742 int encoded_size,
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
743 int channels,
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
744 void *context)
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
745 {
4486
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
746 short *square_array = (short *)context;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
747 int i;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
748 int predictor[2];
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
749 int channel_number = 0;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
750
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
751 // prepare the initial predictors
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
752 if (channels == 1)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
753 predictor[0] = LE_16(&input[0]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
754 else
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
755 {
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
756 predictor[0] = input[1] << 8;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
757 predictor[1] = input[0] << 8;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
758 }
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
759 SE_16BIT(predictor[0]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
760 SE_16BIT(predictor[1]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
761
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
762 // decode the samples
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
763 for (i = 2; i < encoded_size; i++)
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
764 {
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
765 predictor[channel_number] += square_array[input[i]];
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
766 CLAMP_S16(predictor[channel_number]);
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
767 output[i - 2] = predictor[channel_number];
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
768
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
769 // toggle channel
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
770 channel_number ^= channels - 1;
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
771 }
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
772
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
773 // return the number of samples decoded
e69bed07cb27 further work on the RoQ audio decoder
melanson
parents: 4450
diff changeset
774 return (encoded_size - 2);
4450
3da8c5706371 added skeleton decoders for RoQ audio and video format decoders
melanson
parents:
diff changeset
775 }