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