diff options
Diffstat (limited to 'apps/plugins/mpegplayer/header.c')
-rw-r--r-- | apps/plugins/mpegplayer/header.c | 592 |
1 files changed, 427 insertions, 165 deletions
diff --git a/apps/plugins/mpegplayer/header.c b/apps/plugins/mpegplayer/header.c index 664be4badb..52a301f8d8 100644 --- a/apps/plugins/mpegplayer/header.c +++ b/apps/plugins/mpegplayer/header.c | |||
@@ -40,7 +40,8 @@ extern struct plugin_api* rb; | |||
40 | #define PIC_CODING_EXT 0x100 | 40 | #define PIC_CODING_EXT 0x100 |
41 | 41 | ||
42 | /* default intra quant matrix, in zig-zag order */ | 42 | /* default intra quant matrix, in zig-zag order */ |
43 | static const uint8_t default_intra_quantizer_matrix[64] = { | 43 | static const uint8_t default_intra_quantizer_matrix[64] = |
44 | { | ||
44 | 8, | 45 | 8, |
45 | 16, 16, | 46 | 16, 16, |
46 | 19, 16, 19, | 47 | 19, 16, 19, |
@@ -58,20 +59,30 @@ static const uint8_t default_intra_quantizer_matrix[64] = { | |||
58 | 83 | 59 | 83 |
59 | }; | 60 | }; |
60 | 61 | ||
61 | const uint8_t default_mpeg2_scan_norm[64] = { | 62 | const uint8_t default_mpeg2_scan_norm[64] = |
63 | { | ||
62 | /* Zig-Zag scan pattern */ | 64 | /* Zig-Zag scan pattern */ |
63 | 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, | 65 | 0, 1, 8, 16, 9, 2, 3, 10, |
64 | 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, | 66 | 17, 24, 32, 25, 18, 11, 4, 5, |
65 | 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, | 67 | 12, 19, 26, 33, 40, 48, 41, 34, |
66 | 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 | 68 | 27, 20, 13, 6, 7, 14, 21, 28, |
69 | 35, 42, 49, 56, 57, 50, 43, 36, | ||
70 | 29, 22, 15, 23, 30, 37, 44, 51, | ||
71 | 58, 59, 52, 45, 38, 31, 39, 46, | ||
72 | 53, 60, 61, 54, 47, 55, 62, 63 | ||
67 | }; | 73 | }; |
68 | 74 | ||
69 | const uint8_t default_mpeg2_scan_alt[64] = { | 75 | const uint8_t default_mpeg2_scan_alt[64] = |
76 | { | ||
70 | /* Alternate scan pattern */ | 77 | /* Alternate scan pattern */ |
71 | 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49, | 78 | 0, 8, 16, 24, 1, 9, 2, 10, |
72 | 41, 33, 26, 18, 3, 11, 4, 12, 19, 27, 34, 42, 50, 58, 35, 43, | 79 | 17, 25, 32, 40, 48, 56, 57, 49, |
73 | 51, 59, 20, 28, 5, 13, 6, 14, 21, 29, 36, 44, 52, 60, 37, 45, | 80 | 41, 33, 26, 18, 3, 11, 4, 12, |
74 | 53, 61, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63 | 81 | 19, 27, 34, 42, 50, 58, 35, 43, |
82 | 51, 59, 20, 28, 5, 13, 6, 14, | ||
83 | 21, 29, 36, 44, 52, 60, 37, 45, | ||
84 | 53, 61, 22, 30, 7, 15, 23, 31, | ||
85 | 38, 46, 54, 62, 39, 47, 55, 63 | ||
75 | }; | 86 | }; |
76 | 87 | ||
77 | uint8_t mpeg2_scan_norm[64] IDATA_ATTR; | 88 | uint8_t mpeg2_scan_norm[64] IDATA_ATTR; |
@@ -79,33 +90,49 @@ uint8_t mpeg2_scan_alt[64] IDATA_ATTR; | |||
79 | 90 | ||
80 | void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec) | 91 | void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec) |
81 | { | 92 | { |
82 | if (mpeg2dec->sequence.width != (unsigned)-1) { | 93 | if (mpeg2dec->sequence.width != (unsigned)-1) |
94 | { | ||
83 | int i; | 95 | int i; |
84 | 96 | ||
85 | mpeg2dec->sequence.width = (unsigned)-1; | 97 | mpeg2dec->sequence.width = (unsigned)-1; |
98 | |||
86 | if (!mpeg2dec->custom_fbuf) | 99 | if (!mpeg2dec->custom_fbuf) |
100 | { | ||
87 | for (i = mpeg2dec->alloc_index_user; | 101 | for (i = mpeg2dec->alloc_index_user; |
88 | i < mpeg2dec->alloc_index; i++) { | 102 | i < mpeg2dec->alloc_index; i++) |
89 | mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[0]); | 103 | { |
90 | mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[1]); | 104 | mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[0]); |
91 | mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[2]); | 105 | mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[1]); |
106 | mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[2]); | ||
92 | } | 107 | } |
108 | } | ||
109 | |||
93 | if (mpeg2dec->convert_start) | 110 | if (mpeg2dec->convert_start) |
94 | for (i = 0; i < 3; i++) { | 111 | { |
95 | mpeg2_free (mpeg2dec->yuv_buf[i][0]); | 112 | for (i = 0; i < 3; i++) |
96 | mpeg2_free (mpeg2dec->yuv_buf[i][1]); | 113 | { |
97 | mpeg2_free (mpeg2dec->yuv_buf[i][2]); | 114 | mpeg2_free(mpeg2dec->yuv_buf[i][0]); |
115 | mpeg2_free(mpeg2dec->yuv_buf[i][1]); | ||
116 | mpeg2_free(mpeg2dec->yuv_buf[i][2]); | ||
98 | } | 117 | } |
118 | } | ||
119 | |||
99 | if (mpeg2dec->decoder.convert_id) | 120 | if (mpeg2dec->decoder.convert_id) |
100 | mpeg2_free (mpeg2dec->decoder.convert_id); | 121 | { |
122 | mpeg2_free(mpeg2dec->decoder.convert_id); | ||
123 | } | ||
101 | } | 124 | } |
125 | |||
102 | mpeg2dec->decoder.coding_type = I_TYPE; | 126 | mpeg2dec->decoder.coding_type = I_TYPE; |
103 | mpeg2dec->decoder.convert = NULL; | 127 | mpeg2dec->decoder.convert = NULL; |
104 | mpeg2dec->decoder.convert_id = NULL; | 128 | mpeg2dec->decoder.convert_id = NULL; |
129 | |||
105 | mpeg2dec->picture = mpeg2dec->pictures; | 130 | mpeg2dec->picture = mpeg2dec->pictures; |
131 | |||
106 | mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf; | 132 | mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf; |
107 | mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf; | 133 | mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf; |
108 | mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf; | 134 | mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf; |
135 | |||
109 | mpeg2dec->first = 1; | 136 | mpeg2dec->first = 1; |
110 | mpeg2dec->alloc_index = 0; | 137 | mpeg2dec->alloc_index = 0; |
111 | mpeg2dec->alloc_index_user = 0; | 138 | mpeg2dec->alloc_index_user = 0; |
@@ -119,14 +146,21 @@ void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec) | |||
119 | 146 | ||
120 | void mpeg2_reset_info (mpeg2_info_t * info) | 147 | void mpeg2_reset_info (mpeg2_info_t * info) |
121 | { | 148 | { |
122 | info->current_picture = info->current_picture_2nd = NULL; | 149 | info->current_picture = |
123 | info->display_picture = info->display_picture_2nd = NULL; | 150 | info->current_picture_2nd = NULL; |
124 | info->current_fbuf = info->display_fbuf = info->discard_fbuf = NULL; | 151 | |
152 | info->display_picture = | ||
153 | info->display_picture_2nd = NULL; | ||
154 | |||
155 | info->current_fbuf = | ||
156 | info->display_fbuf = | ||
157 | info->discard_fbuf = NULL; | ||
125 | } | 158 | } |
126 | 159 | ||
127 | static void info_user_data (mpeg2dec_t * mpeg2dec) | 160 | static void info_user_data (mpeg2dec_t * mpeg2dec) |
128 | { | 161 | { |
129 | if (mpeg2dec->user_data_len) { | 162 | if (mpeg2dec->user_data_len) |
163 | { | ||
130 | mpeg2dec->info.user_data = mpeg2dec->chunk_buffer; | 164 | mpeg2dec->info.user_data = mpeg2dec->chunk_buffer; |
131 | mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3; | 165 | mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3; |
132 | } | 166 | } |
@@ -134,60 +168,81 @@ static void info_user_data (mpeg2dec_t * mpeg2dec) | |||
134 | 168 | ||
135 | int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec) | 169 | int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec) |
136 | { | 170 | { |
137 | uint8_t * buffer = mpeg2dec->chunk_start; | 171 | static const unsigned int frame_period[16] = |
138 | mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); | 172 | { |
139 | static unsigned int frame_period[16] = { | ||
140 | 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000, | 173 | 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000, |
141 | /* unofficial: xing 15 fps */ | 174 | /* unofficial: xing 15 fps */ |
142 | 1800000, | 175 | 1800000, |
143 | /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */ | 176 | /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */ |
144 | 5400000, 2700000, 2250000, 1800000, 0, 0 | 177 | 5400000, 2700000, 2250000, 1800000, 0, 0 |
145 | }; | 178 | }; |
179 | |||
180 | uint8_t * buffer = mpeg2dec->chunk_start; | ||
181 | mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence; | ||
146 | int i; | 182 | int i; |
147 | 183 | ||
148 | if ((buffer[6] & 0x20) != 0x20) /* missing marker_bit */ | 184 | if ((buffer[6] & 0x20) != 0x20) /* missing marker_bit */ |
149 | return 1; | 185 | return 1; |
150 | 186 | ||
151 | i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; | 187 | i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; |
152 | if (! (sequence->display_width = sequence->picture_width = i >> 12)) | 188 | |
189 | if (!(sequence->display_width = sequence->picture_width = i >> 12)) | ||
153 | return 1; | 190 | return 1; |
154 | if (! (sequence->display_height = sequence->picture_height = i & 0xfff)) | 191 | |
192 | if (!(sequence->display_height = sequence->picture_height = i & 0xfff)) | ||
155 | return 1; | 193 | return 1; |
194 | |||
156 | sequence->width = (sequence->picture_width + 15) & ~15; | 195 | sequence->width = (sequence->picture_width + 15) & ~15; |
157 | sequence->height = (sequence->picture_height + 15) & ~15; | 196 | sequence->height = (sequence->picture_height + 15) & ~15; |
158 | sequence->chroma_width = sequence->width >> 1; | 197 | sequence->chroma_width = sequence->width >> 1; |
159 | sequence->chroma_height = sequence->height >> 1; | 198 | sequence->chroma_height = sequence->height >> 1; |
160 | 199 | ||
161 | sequence->flags = (SEQ_FLAG_PROGRESSIVE_SEQUENCE | | 200 | sequence->flags = SEQ_FLAG_PROGRESSIVE_SEQUENCE | |
162 | SEQ_VIDEO_FORMAT_UNSPECIFIED); | 201 | SEQ_VIDEO_FORMAT_UNSPECIFIED; |
163 | 202 | ||
164 | sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */ | 203 | sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */ |
165 | sequence->frame_period = frame_period[buffer[3] & 15]; | 204 | sequence->frame_period = frame_period[buffer[3] & 15]; |
166 | 205 | ||
167 | sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6); | 206 | sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6); |
168 | 207 | ||
169 | sequence->vbv_buffer_size = ((buffer[6]<<16)|(buffer[7]<<8))&0x1ff800; | 208 | sequence->vbv_buffer_size = ((buffer[6]<<16) | (buffer[7]<<8)) & 0x1ff800; |
170 | 209 | ||
171 | if (buffer[7] & 4) | 210 | if (buffer[7] & 4) |
172 | sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS; | 211 | sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS; |
173 | 212 | ||
174 | mpeg2dec->copy_matrix = 3; | 213 | mpeg2dec->copy_matrix = 3; |
175 | if (buffer[7] & 2) { | 214 | |
215 | if (buffer[7] & 2) | ||
216 | { | ||
176 | for (i = 0; i < 64; i++) | 217 | for (i = 0; i < 64; i++) |
218 | { | ||
177 | mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] = | 219 | mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] = |
178 | (buffer[i+7] << 7) | (buffer[i+8] >> 1); | 220 | (buffer[i+7] << 7) | (buffer[i+8] >> 1); |
221 | } | ||
222 | |||
179 | buffer += 64; | 223 | buffer += 64; |
180 | } else | 224 | } |
225 | else | ||
226 | { | ||
181 | for (i = 0; i < 64; i++) | 227 | for (i = 0; i < 64; i++) |
228 | { | ||
182 | mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] = | 229 | mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] = |
183 | default_intra_quantizer_matrix[i]; | 230 | default_intra_quantizer_matrix[i]; |
231 | } | ||
232 | } | ||
184 | 233 | ||
185 | if (buffer[7] & 1) | 234 | if (buffer[7] & 1) |
235 | { | ||
186 | for (i = 0; i < 64; i++) | 236 | for (i = 0; i < 64; i++) |
237 | { | ||
187 | mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] = | 238 | mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] = |
188 | buffer[i+8]; | 239 | buffer[i+8]; |
240 | } | ||
241 | } | ||
189 | else | 242 | else |
243 | { | ||
190 | rb->memset (mpeg2dec->new_quantizer_matrix[1], 16, 64); | 244 | rb->memset (mpeg2dec->new_quantizer_matrix[1], 16, 64); |
245 | } | ||
191 | 246 | ||
192 | sequence->profile_level_id = 0x80; | 247 | sequence->profile_level_id = 0x80; |
193 | sequence->colour_primaries = 0; | 248 | sequence->colour_primaries = 0; |
@@ -196,7 +251,9 @@ int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec) | |||
196 | 251 | ||
197 | mpeg2dec->ext_state = SEQ_EXT; | 252 | mpeg2dec->ext_state = SEQ_EXT; |
198 | mpeg2dec->state = STATE_SEQUENCE; | 253 | mpeg2dec->state = STATE_SEQUENCE; |
199 | mpeg2dec->display_offset_x = mpeg2dec->display_offset_y = 0; | 254 | |
255 | mpeg2dec->display_offset_x = | ||
256 | mpeg2dec->display_offset_y = 0; | ||
200 | 257 | ||
201 | return 0; | 258 | return 0; |
202 | } | 259 | } |
@@ -204,7 +261,7 @@ int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec) | |||
204 | static int sequence_ext (mpeg2dec_t * mpeg2dec) | 261 | static int sequence_ext (mpeg2dec_t * mpeg2dec) |
205 | { | 262 | { |
206 | uint8_t * buffer = mpeg2dec->chunk_start; | 263 | uint8_t * buffer = mpeg2dec->chunk_start; |
207 | mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); | 264 | mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence; |
208 | uint32_t flags; | 265 | uint32_t flags; |
209 | 266 | ||
210 | if (!(buffer[3] & 1)) | 267 | if (!(buffer[3] & 1)) |
@@ -212,23 +269,32 @@ static int sequence_ext (mpeg2dec_t * mpeg2dec) | |||
212 | 269 | ||
213 | sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4); | 270 | sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4); |
214 | 271 | ||
215 | sequence->display_width = sequence->picture_width += | 272 | sequence->picture_width += ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000; |
216 | ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000; | 273 | sequence->display_width = sequence->picture_width; |
217 | sequence->display_height = sequence->picture_height += | 274 | |
218 | (buffer[2] << 7) & 0x3000; | 275 | sequence->picture_height += (buffer[2] << 7) & 0x3000; |
276 | sequence->display_height = sequence->picture_height; | ||
277 | |||
219 | sequence->width = (sequence->picture_width + 15) & ~15; | 278 | sequence->width = (sequence->picture_width + 15) & ~15; |
220 | sequence->height = (sequence->picture_height + 15) & ~15; | 279 | sequence->height = (sequence->picture_height + 15) & ~15; |
280 | |||
221 | flags = sequence->flags | SEQ_FLAG_MPEG2; | 281 | flags = sequence->flags | SEQ_FLAG_MPEG2; |
222 | if (!(buffer[1] & 8)) { | 282 | |
283 | if (!(buffer[1] & 8)) | ||
284 | { | ||
223 | flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE; | 285 | flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE; |
224 | sequence->height = (sequence->height + 31) & ~31; | 286 | sequence->height = (sequence->height + 31) & ~31; |
225 | } | 287 | } |
288 | |||
226 | if (buffer[5] & 0x80) | 289 | if (buffer[5] & 0x80) |
227 | flags |= SEQ_FLAG_LOW_DELAY; | 290 | flags |= SEQ_FLAG_LOW_DELAY; |
291 | |||
228 | sequence->flags = flags; | 292 | sequence->flags = flags; |
229 | sequence->chroma_width = sequence->width; | 293 | sequence->chroma_width = sequence->width; |
230 | sequence->chroma_height = sequence->height; | 294 | sequence->chroma_height = sequence->height; |
231 | switch (buffer[1] & 6) { | 295 | |
296 | switch (buffer[1] & 6) | ||
297 | { | ||
232 | case 0: /* invalid */ | 298 | case 0: /* invalid */ |
233 | return 1; | 299 | return 1; |
234 | case 2: /* 4:2:0 */ | 300 | case 2: /* 4:2:0 */ |
@@ -252,12 +318,14 @@ static int sequence_ext (mpeg2dec_t * mpeg2dec) | |||
252 | static int sequence_display_ext (mpeg2dec_t * mpeg2dec) | 318 | static int sequence_display_ext (mpeg2dec_t * mpeg2dec) |
253 | { | 319 | { |
254 | uint8_t * buffer = mpeg2dec->chunk_start; | 320 | uint8_t * buffer = mpeg2dec->chunk_start; |
255 | mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); | 321 | mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence; |
256 | uint32_t flags; | 322 | uint32_t flags; |
257 | 323 | ||
258 | flags = ((sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) | | 324 | flags = (sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) | |
259 | ((buffer[0]<<4) & SEQ_MASK_VIDEO_FORMAT)); | 325 | ((buffer[0] << 4) & SEQ_MASK_VIDEO_FORMAT); |
260 | if (buffer[0] & 1) { | 326 | |
327 | if (buffer[0] & 1) | ||
328 | { | ||
261 | flags |= SEQ_FLAG_COLOUR_DESCRIPTION; | 329 | flags |= SEQ_FLAG_COLOUR_DESCRIPTION; |
262 | sequence->colour_primaries = buffer[1]; | 330 | sequence->colour_primaries = buffer[1]; |
263 | sequence->transfer_characteristics = buffer[2]; | 331 | sequence->transfer_characteristics = buffer[2]; |
@@ -268,9 +336,11 @@ static int sequence_display_ext (mpeg2dec_t * mpeg2dec) | |||
268 | if (!(buffer[2] & 2)) /* missing marker_bit */ | 336 | if (!(buffer[2] & 2)) /* missing marker_bit */ |
269 | return 1; | 337 | return 1; |
270 | 338 | ||
271 | sequence->display_width = (buffer[1] << 6) | (buffer[2] >> 2); | 339 | sequence->display_width = |
340 | (buffer[1] << 6) | (buffer[2] >> 2); | ||
341 | |||
272 | sequence->display_height = | 342 | sequence->display_height = |
273 | ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3); | 343 | ((buffer[2] & 1) << 13) | (buffer[3] << 5) | (buffer[4] >> 3); |
274 | 344 | ||
275 | return 0; | 345 | return 0; |
276 | } | 346 | } |
@@ -282,37 +352,63 @@ static inline void finalize_sequence (mpeg2_sequence_t * sequence) | |||
282 | 352 | ||
283 | sequence->byte_rate *= 50; | 353 | sequence->byte_rate *= 50; |
284 | 354 | ||
285 | if (sequence->flags & SEQ_FLAG_MPEG2) { | 355 | if (sequence->flags & SEQ_FLAG_MPEG2) |
286 | switch (sequence->pixel_width) { | 356 | { |
357 | switch (sequence->pixel_width) | ||
358 | { | ||
287 | case 1: /* square pixels */ | 359 | case 1: /* square pixels */ |
288 | sequence->pixel_width = sequence->pixel_height = 1; return; | 360 | sequence->pixel_width = |
361 | sequence->pixel_height = 1; | ||
362 | return; | ||
289 | case 2: /* 4:3 aspect ratio */ | 363 | case 2: /* 4:3 aspect ratio */ |
290 | width = 4; height = 3; break; | 364 | width = 4; |
365 | height = 3; | ||
366 | break; | ||
291 | case 3: /* 16:9 aspect ratio */ | 367 | case 3: /* 16:9 aspect ratio */ |
292 | width = 16; height = 9; break; | 368 | width = 16; |
369 | height = 9; | ||
370 | break; | ||
293 | case 4: /* 2.21:1 aspect ratio */ | 371 | case 4: /* 2.21:1 aspect ratio */ |
294 | width = 221; height = 100; break; | 372 | width = 221; |
373 | height = 100; | ||
374 | break; | ||
295 | default: /* illegal */ | 375 | default: /* illegal */ |
296 | sequence->pixel_width = sequence->pixel_height = 0; return; | 376 | sequence->pixel_width = |
377 | sequence->pixel_height = 0; | ||
378 | return; | ||
297 | } | 379 | } |
380 | |||
298 | width *= sequence->display_height; | 381 | width *= sequence->display_height; |
299 | height *= sequence->display_width; | 382 | height *= sequence->display_width; |
300 | 383 | } | |
301 | } else { | 384 | else |
302 | if (sequence->byte_rate == 50 * 0x3ffff) | 385 | { |
303 | sequence->byte_rate = 0; /* mpeg-1 VBR */ | 386 | if (sequence->byte_rate == 50 * 0x3ffff) |
304 | 387 | sequence->byte_rate = 0; /* mpeg-1 VBR */ | |
305 | switch (sequence->pixel_width) { | 388 | |
306 | case 0: case 15: /* illegal */ | 389 | switch (sequence->pixel_width) |
307 | sequence->pixel_width = sequence->pixel_height = 0; return; | 390 | { |
391 | case 0: | ||
392 | case 15: /* illegal */ | ||
393 | sequence->pixel_width = | ||
394 | sequence->pixel_height = 0; | ||
395 | return; | ||
308 | case 1: /* square pixels */ | 396 | case 1: /* square pixels */ |
309 | sequence->pixel_width = sequence->pixel_height = 1; return; | 397 | sequence->pixel_width = |
398 | sequence->pixel_height = 1; | ||
399 | return; | ||
310 | case 3: /* 720x576 16:9 */ | 400 | case 3: /* 720x576 16:9 */ |
311 | sequence->pixel_width = 64; sequence->pixel_height = 45; return; | 401 | sequence->pixel_width = 64; |
402 | sequence->pixel_height = 45; | ||
403 | return; | ||
312 | case 6: /* 720x480 16:9 */ | 404 | case 6: /* 720x480 16:9 */ |
313 | sequence->pixel_width = 32; sequence->pixel_height = 27; return; | 405 | sequence->pixel_width = 32; |
406 | sequence->pixel_height = 27; | ||
407 | return; | ||
314 | case 12: /* 720*480 4:3 */ | 408 | case 12: /* 720*480 4:3 */ |
315 | sequence->pixel_width = 8; sequence->pixel_height = 9; return; | 409 | sequence->pixel_width = 8; |
410 | sequence->pixel_height = 9; | ||
411 | return; | ||
316 | default: | 412 | default: |
317 | height = 88 * sequence->pixel_width + 1171; | 413 | height = 88 * sequence->pixel_width + 1171; |
318 | width = 2000; | 414 | width = 2000; |
@@ -321,11 +417,15 @@ static inline void finalize_sequence (mpeg2_sequence_t * sequence) | |||
321 | 417 | ||
322 | sequence->pixel_width = width; | 418 | sequence->pixel_width = width; |
323 | sequence->pixel_height = height; | 419 | sequence->pixel_height = height; |
324 | while (width) { /* find greatest common divisor */ | 420 | |
421 | /* find greatest common divisor */ | ||
422 | while (width) | ||
423 | { | ||
325 | int tmp = width; | 424 | int tmp = width; |
326 | width = height % tmp; | 425 | width = height % tmp; |
327 | height = tmp; | 426 | height = tmp; |
328 | } | 427 | } |
428 | |||
329 | sequence->pixel_width /= height; | 429 | sequence->pixel_width /= height; |
330 | sequence->pixel_height /= height; | 430 | sequence->pixel_height /= height; |
331 | } | 431 | } |
@@ -333,59 +433,73 @@ static inline void finalize_sequence (mpeg2_sequence_t * sequence) | |||
333 | static void copy_matrix (mpeg2dec_t * mpeg2dec, int index) | 433 | static void copy_matrix (mpeg2dec_t * mpeg2dec, int index) |
334 | { | 434 | { |
335 | if (rb->memcmp (mpeg2dec->quantizer_matrix[index], | 435 | if (rb->memcmp (mpeg2dec->quantizer_matrix[index], |
336 | mpeg2dec->new_quantizer_matrix[index], 64)) { | 436 | mpeg2dec->new_quantizer_matrix[index], 64)) |
437 | { | ||
337 | rb->memcpy (mpeg2dec->quantizer_matrix[index], | 438 | rb->memcpy (mpeg2dec->quantizer_matrix[index], |
338 | mpeg2dec->new_quantizer_matrix[index], 64); | 439 | mpeg2dec->new_quantizer_matrix[index], 64); |
440 | |||
339 | mpeg2dec->scaled[index] = -1; | 441 | mpeg2dec->scaled[index] = -1; |
340 | } | 442 | } |
341 | } | 443 | } |
342 | 444 | ||
343 | static void finalize_matrix (mpeg2dec_t * mpeg2dec) | 445 | static void finalize_matrix (mpeg2dec_t * mpeg2dec) |
344 | { | 446 | { |
345 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 447 | mpeg2_decoder_t *decoder = &mpeg2dec->decoder; |
346 | int i; | 448 | int i; |
347 | 449 | ||
348 | for (i = 0; i < 2; i++) { | 450 | for (i = 0; i < 2; i++) |
451 | { | ||
349 | if (mpeg2dec->copy_matrix & (1 << i)) | 452 | if (mpeg2dec->copy_matrix & (1 << i)) |
350 | copy_matrix (mpeg2dec, i); | 453 | copy_matrix (mpeg2dec, i); |
454 | |||
351 | if ((mpeg2dec->copy_matrix & (4 << i)) && | 455 | if ((mpeg2dec->copy_matrix & (4 << i)) && |
352 | rb->memcmp (mpeg2dec->quantizer_matrix[i], | 456 | rb->memcmp(mpeg2dec->quantizer_matrix[i], |
353 | mpeg2dec->new_quantizer_matrix[i+2], 64)) { | 457 | mpeg2dec->new_quantizer_matrix[i+2], 64)) |
458 | { | ||
354 | copy_matrix (mpeg2dec, i + 2); | 459 | copy_matrix (mpeg2dec, i + 2); |
355 | decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2]; | 460 | decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2]; |
356 | } else if (mpeg2dec->copy_matrix & (5 << i)) | 461 | } |
462 | else if (mpeg2dec->copy_matrix & (5 << i)) | ||
463 | { | ||
357 | decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i]; | 464 | decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i]; |
465 | } | ||
358 | } | 466 | } |
359 | } | 467 | } |
360 | 468 | ||
361 | static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec) | 469 | static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec) |
362 | { | 470 | { |
363 | mpeg2_reset_info (&(mpeg2dec->info)); | 471 | mpeg2_reset_info (&mpeg2dec->info); |
472 | |||
364 | mpeg2dec->info.gop = NULL; | 473 | mpeg2dec->info.gop = NULL; |
474 | |||
365 | info_user_data (mpeg2dec); | 475 | info_user_data (mpeg2dec); |
476 | |||
366 | mpeg2_header_state_init (mpeg2dec); | 477 | mpeg2_header_state_init (mpeg2dec); |
478 | |||
367 | mpeg2dec->sequence = mpeg2dec->new_sequence; | 479 | mpeg2dec->sequence = mpeg2dec->new_sequence; |
368 | mpeg2dec->action = mpeg2_seek_header; | 480 | mpeg2dec->action = mpeg2_seek_header; |
369 | mpeg2dec->state = STATE_SEQUENCE; | 481 | mpeg2dec->state = STATE_SEQUENCE; |
482 | |||
370 | return STATE_SEQUENCE; | 483 | return STATE_SEQUENCE; |
371 | } | 484 | } |
372 | 485 | ||
373 | void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec) | 486 | void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec) |
374 | { | 487 | { |
375 | mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); | 488 | mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence; |
376 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 489 | mpeg2_decoder_t * decoder = &mpeg2dec->decoder; |
377 | 490 | ||
378 | finalize_sequence (sequence); | 491 | finalize_sequence(sequence); |
379 | finalize_matrix (mpeg2dec); | 492 | finalize_matrix(mpeg2dec); |
380 | 493 | ||
381 | decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2); | 494 | decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2); |
382 | decoder->width = sequence->width; | 495 | decoder->width = sequence->width; |
383 | decoder->height = sequence->height; | 496 | decoder->height = sequence->height; |
384 | decoder->vertical_position_extension = (sequence->picture_height > 2800); | 497 | decoder->vertical_position_extension = sequence->picture_height > 2800; |
385 | decoder->chroma_format = ((sequence->chroma_width == sequence->width) + | 498 | decoder->chroma_format = (sequence->chroma_width == sequence->width) + |
386 | (sequence->chroma_height == sequence->height)); | 499 | (sequence->chroma_height == sequence->height); |
387 | 500 | ||
388 | if (mpeg2dec->sequence.width != (unsigned)-1) { | 501 | if (mpeg2dec->sequence.width != (unsigned)-1) |
502 | { | ||
389 | unsigned int new_byte_rate; | 503 | unsigned int new_byte_rate; |
390 | 504 | ||
391 | /* | 505 | /* |
@@ -400,38 +514,50 @@ void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec) | |||
400 | */ | 514 | */ |
401 | new_byte_rate = sequence->byte_rate; | 515 | new_byte_rate = sequence->byte_rate; |
402 | sequence->byte_rate = mpeg2dec->sequence.byte_rate; | 516 | sequence->byte_rate = mpeg2dec->sequence.byte_rate; |
403 | if (rb->memcmp (&(mpeg2dec->sequence), sequence, | 517 | |
404 | sizeof (mpeg2_sequence_t))) { | 518 | if (rb->memcmp(&mpeg2dec->sequence, sequence, |
519 | sizeof (mpeg2_sequence_t))) | ||
520 | { | ||
405 | decoder->stride_frame = sequence->width; | 521 | decoder->stride_frame = sequence->width; |
406 | sequence->byte_rate = new_byte_rate; | 522 | sequence->byte_rate = new_byte_rate; |
523 | |||
407 | mpeg2_header_end (mpeg2dec); | 524 | mpeg2_header_end (mpeg2dec); |
525 | |||
408 | mpeg2dec->action = invalid_end_action; | 526 | mpeg2dec->action = invalid_end_action; |
409 | mpeg2dec->state = STATE_INVALID_END; | 527 | mpeg2dec->state = STATE_INVALID_END; |
410 | return; | 528 | return; |
411 | } | 529 | } |
530 | |||
412 | sequence->byte_rate = new_byte_rate; | 531 | sequence->byte_rate = new_byte_rate; |
413 | mpeg2dec->state = STATE_SEQUENCE_REPEATED; | 532 | mpeg2dec->state = STATE_SEQUENCE_REPEATED; |
414 | } else | 533 | } |
534 | else | ||
535 | { | ||
415 | decoder->stride_frame = sequence->width; | 536 | decoder->stride_frame = sequence->width; |
537 | } | ||
538 | |||
416 | mpeg2dec->sequence = *sequence; | 539 | mpeg2dec->sequence = *sequence; |
417 | mpeg2_reset_info (&(mpeg2dec->info)); | 540 | mpeg2_reset_info(&mpeg2dec->info); |
418 | mpeg2dec->info.sequence = &(mpeg2dec->sequence); | 541 | mpeg2dec->info.sequence = &mpeg2dec->sequence; |
419 | mpeg2dec->info.gop = NULL; | 542 | mpeg2dec->info.gop = NULL; |
543 | |||
420 | info_user_data (mpeg2dec); | 544 | info_user_data (mpeg2dec); |
421 | } | 545 | } |
422 | 546 | ||
423 | int mpeg2_header_gop (mpeg2dec_t * mpeg2dec) | 547 | int mpeg2_header_gop (mpeg2dec_t * mpeg2dec) |
424 | { | 548 | { |
425 | uint8_t * buffer = mpeg2dec->chunk_start; | 549 | uint8_t * buffer = mpeg2dec->chunk_start; |
426 | mpeg2_gop_t * gop = &(mpeg2dec->new_gop); | 550 | mpeg2_gop_t * gop = &mpeg2dec->new_gop; |
427 | 551 | ||
428 | if (! (buffer[1] & 8)) | 552 | if (!(buffer[1] & 8)) |
429 | return 1; | 553 | return 1; |
554 | |||
430 | gop->hours = (buffer[0] >> 2) & 31; | 555 | gop->hours = (buffer[0] >> 2) & 31; |
431 | gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63; | 556 | gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63; |
432 | gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63; | 557 | gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63; |
433 | gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63; | 558 | gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63; |
434 | gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6); | 559 | gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6); |
560 | |||
435 | mpeg2dec->state = STATE_GOP; | 561 | mpeg2dec->state = STATE_GOP; |
436 | return 0; | 562 | return 0; |
437 | } | 563 | } |
@@ -439,8 +565,8 @@ int mpeg2_header_gop (mpeg2dec_t * mpeg2dec) | |||
439 | void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec) | 565 | void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec) |
440 | { | 566 | { |
441 | mpeg2dec->gop = mpeg2dec->new_gop; | 567 | mpeg2dec->gop = mpeg2dec->new_gop; |
442 | mpeg2_reset_info (&(mpeg2dec->info)); | 568 | mpeg2_reset_info (&mpeg2dec->info); |
443 | mpeg2dec->info.gop = &(mpeg2dec->gop); | 569 | mpeg2dec->info.gop = &mpeg2dec->gop; |
444 | info_user_data (mpeg2dec); | 570 | info_user_data (mpeg2dec); |
445 | } | 571 | } |
446 | 572 | ||
@@ -449,52 +575,67 @@ void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type) | |||
449 | int i; | 575 | int i; |
450 | 576 | ||
451 | for (i = 0; i < 3; i++) | 577 | for (i = 0; i < 3; i++) |
578 | { | ||
452 | if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf && | 579 | if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf && |
453 | mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) { | 580 | mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) |
581 | { | ||
454 | mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf; | 582 | mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf; |
455 | mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0]; | 583 | mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0]; |
456 | if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) { | 584 | |
585 | if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) | ||
586 | { | ||
457 | if (b_type || mpeg2dec->convert) | 587 | if (b_type || mpeg2dec->convert) |
458 | mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; | 588 | mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; |
589 | |||
459 | mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0]; | 590 | mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0]; |
460 | } | 591 | } |
592 | |||
461 | break; | 593 | break; |
462 | } | 594 | } |
595 | } | ||
463 | } | 596 | } |
464 | 597 | ||
465 | mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec) | 598 | mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec) |
466 | { | 599 | { |
467 | mpeg2_picture_t * picture = &(mpeg2dec->new_picture); | 600 | mpeg2_picture_t * picture = &mpeg2dec->new_picture; |
468 | 601 | ||
469 | mpeg2dec->state = ((mpeg2dec->state != STATE_SLICE_1ST) ? | 602 | mpeg2dec->state = (mpeg2dec->state != STATE_SLICE_1ST) ? |
470 | STATE_PICTURE : STATE_PICTURE_2ND); | 603 | STATE_PICTURE : STATE_PICTURE_2ND; |
471 | picture->flags = 0; | 604 | picture->flags = 0; |
472 | picture->tag = picture->tag2 = 0; | 605 | picture->tag = picture->tag2 = 0; |
473 | if (mpeg2dec->num_tags) { | 606 | |
474 | if (mpeg2dec->bytes_since_tag >= 4) { | 607 | if (mpeg2dec->num_tags) |
608 | { | ||
609 | if (mpeg2dec->bytes_since_tag >= 4) | ||
610 | { | ||
475 | mpeg2dec->num_tags = 0; | 611 | mpeg2dec->num_tags = 0; |
476 | picture->tag = mpeg2dec->tag_current; | 612 | picture->tag = mpeg2dec->tag_current; |
477 | picture->tag2 = mpeg2dec->tag2_current; | 613 | picture->tag2 = mpeg2dec->tag2_current; |
478 | picture->flags = PIC_FLAG_TAGS; | 614 | picture->flags = PIC_FLAG_TAGS; |
479 | } else if (mpeg2dec->num_tags > 1) { | 615 | } |
616 | else if (mpeg2dec->num_tags > 1) | ||
617 | { | ||
480 | mpeg2dec->num_tags = 1; | 618 | mpeg2dec->num_tags = 1; |
481 | picture->tag = mpeg2dec->tag_previous; | 619 | picture->tag = mpeg2dec->tag_previous; |
482 | picture->tag2 = mpeg2dec->tag2_previous; | 620 | picture->tag2 = mpeg2dec->tag2_previous; |
483 | picture->flags = PIC_FLAG_TAGS; | 621 | picture->flags = PIC_FLAG_TAGS; |
484 | } | 622 | } |
485 | } | 623 | } |
624 | |||
486 | picture->display_offset[0].x = picture->display_offset[1].x = | 625 | picture->display_offset[0].x = picture->display_offset[1].x = |
487 | picture->display_offset[2].x = mpeg2dec->display_offset_x; | 626 | picture->display_offset[2].x = mpeg2dec->display_offset_x; |
627 | |||
488 | picture->display_offset[0].y = picture->display_offset[1].y = | 628 | picture->display_offset[0].y = picture->display_offset[1].y = |
489 | picture->display_offset[2].y = mpeg2dec->display_offset_y; | 629 | picture->display_offset[2].y = mpeg2dec->display_offset_y; |
630 | |||
490 | return mpeg2_parse_header (mpeg2dec); | 631 | return mpeg2_parse_header (mpeg2dec); |
491 | } | 632 | } |
492 | 633 | ||
493 | int mpeg2_header_picture (mpeg2dec_t * mpeg2dec) | 634 | int mpeg2_header_picture (mpeg2dec_t * mpeg2dec) |
494 | { | 635 | { |
495 | uint8_t * buffer = mpeg2dec->chunk_start; | 636 | uint8_t * buffer = mpeg2dec->chunk_start; |
496 | mpeg2_picture_t * picture = &(mpeg2dec->new_picture); | 637 | mpeg2_picture_t * picture = &mpeg2dec->new_picture; |
497 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 638 | mpeg2_decoder_t * decoder = &mpeg2dec->decoder; |
498 | int type; | 639 | int type; |
499 | 640 | ||
500 | type = (buffer [1] >> 3) & 7; | 641 | type = (buffer [1] >> 3) & 7; |
@@ -504,7 +645,8 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec) | |||
504 | 645 | ||
505 | picture->flags |= type; | 646 | picture->flags |= type; |
506 | 647 | ||
507 | if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B) { | 648 | if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B) |
649 | { | ||
508 | /* forward_f_code and backward_f_code - used in mpeg1 only */ | 650 | /* forward_f_code and backward_f_code - used in mpeg1 only */ |
509 | decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1; | 651 | decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1; |
510 | decoder->f_motion.f_code[0] = | 652 | decoder->f_motion.f_code[0] = |
@@ -531,8 +673,8 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec) | |||
531 | static int picture_coding_ext (mpeg2dec_t * mpeg2dec) | 673 | static int picture_coding_ext (mpeg2dec_t * mpeg2dec) |
532 | { | 674 | { |
533 | uint8_t * buffer = mpeg2dec->chunk_start; | 675 | uint8_t * buffer = mpeg2dec->chunk_start; |
534 | mpeg2_picture_t * picture = &(mpeg2dec->new_picture); | 676 | mpeg2_picture_t * picture = &mpeg2dec->new_picture; |
535 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 677 | mpeg2_decoder_t * decoder = &mpeg2dec->decoder; |
536 | uint32_t flags; | 678 | uint32_t flags; |
537 | 679 | ||
538 | /* pre subtract 1 for use later in compute_motion_vector */ | 680 | /* pre subtract 1 for use later in compute_motion_vector */ |
@@ -542,24 +684,32 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec) | |||
542 | decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1; | 684 | decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1; |
543 | 685 | ||
544 | flags = picture->flags; | 686 | flags = picture->flags; |
687 | |||
545 | decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3); | 688 | decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3); |
546 | decoder->picture_structure = buffer[2] & 3; | 689 | decoder->picture_structure = buffer[2] & 3; |
547 | switch (decoder->picture_structure) { | 690 | |
691 | switch (decoder->picture_structure) | ||
692 | { | ||
548 | case TOP_FIELD: | 693 | case TOP_FIELD: |
549 | flags |= PIC_FLAG_TOP_FIELD_FIRST; | 694 | flags |= PIC_FLAG_TOP_FIELD_FIRST; |
550 | case BOTTOM_FIELD: | 695 | case BOTTOM_FIELD: |
551 | picture->nb_fields = 1; | 696 | picture->nb_fields = 1; |
552 | break; | 697 | break; |
553 | case FRAME_PICTURE: | 698 | case FRAME_PICTURE: |
554 | if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) { | 699 | if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) |
700 | { | ||
555 | picture->nb_fields = (buffer[3] & 2) ? 3 : 2; | 701 | picture->nb_fields = (buffer[3] & 2) ? 3 : 2; |
556 | flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0; | 702 | flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0; |
557 | } else | 703 | } |
704 | else | ||
705 | { | ||
558 | picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2; | 706 | picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2; |
707 | } | ||
559 | break; | 708 | break; |
560 | default: | 709 | default: |
561 | return 1; | 710 | return 1; |
562 | } | 711 | } |
712 | |||
563 | decoder->top_field_first = buffer[3] >> 7; | 713 | decoder->top_field_first = buffer[3] >> 7; |
564 | decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1; | 714 | decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1; |
565 | decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1; | 715 | decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1; |
@@ -567,9 +717,13 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec) | |||
567 | decoder->intra_vlc_format = (buffer[3] >> 3) & 1; | 717 | decoder->intra_vlc_format = (buffer[3] >> 3) & 1; |
568 | decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm; | 718 | decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm; |
569 | flags |= (buffer[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME : 0; | 719 | flags |= (buffer[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME : 0; |
720 | |||
570 | if (buffer[4] & 0x40) | 721 | if (buffer[4] & 0x40) |
722 | { | ||
571 | flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) & | 723 | flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) & |
572 | PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY; | 724 | PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY; |
725 | } | ||
726 | |||
573 | picture->flags = flags; | 727 | picture->flags = flags; |
574 | 728 | ||
575 | mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT; | 729 | mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT; |
@@ -580,124 +734,162 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec) | |||
580 | static int picture_display_ext (mpeg2dec_t * mpeg2dec) | 734 | static int picture_display_ext (mpeg2dec_t * mpeg2dec) |
581 | { | 735 | { |
582 | uint8_t * buffer = mpeg2dec->chunk_start; | 736 | uint8_t * buffer = mpeg2dec->chunk_start; |
583 | mpeg2_picture_t * picture = &(mpeg2dec->new_picture); | 737 | mpeg2_picture_t * picture = &mpeg2dec->new_picture; |
584 | int i, nb_pos; | 738 | int i, nb_pos; |
585 | 739 | ||
586 | nb_pos = picture->nb_fields; | 740 | nb_pos = picture->nb_fields; |
741 | |||
587 | if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) | 742 | if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) |
588 | nb_pos >>= 1; | 743 | nb_pos >>= 1; |
589 | 744 | ||
590 | for (i = 0; i < nb_pos; i++) { | 745 | for (i = 0; i < nb_pos; i++) |
746 | { | ||
591 | int x, y; | 747 | int x, y; |
592 | 748 | ||
593 | x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) | | 749 | x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) | |
594 | (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i); | 750 | (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i); |
751 | |||
595 | y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) | | 752 | y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) | |
596 | (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i); | 753 | (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i); |
754 | |||
597 | if (! (x & y & 1)) | 755 | if (! (x & y & 1)) |
598 | return 1; | 756 | return 1; |
757 | |||
599 | picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1; | 758 | picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1; |
600 | picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1; | 759 | picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1; |
601 | } | 760 | } |
602 | for (; i < 3; i++) { | 761 | |
762 | for (; i < 3; i++) | ||
763 | { | ||
603 | picture->display_offset[i].x = mpeg2dec->display_offset_x; | 764 | picture->display_offset[i].x = mpeg2dec->display_offset_x; |
604 | picture->display_offset[i].y = mpeg2dec->display_offset_y; | 765 | picture->display_offset[i].y = mpeg2dec->display_offset_y; |
605 | } | 766 | } |
767 | |||
606 | return 0; | 768 | return 0; |
607 | } | 769 | } |
608 | 770 | ||
609 | void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec) | 771 | void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec) |
610 | { | 772 | { |
611 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 773 | mpeg2_decoder_t * decoder = &mpeg2dec->decoder; |
612 | int old_type_b = (decoder->coding_type == B_TYPE); | 774 | int old_type_b = decoder->coding_type == B_TYPE; |
613 | int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY; | 775 | int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY; |
614 | 776 | ||
615 | finalize_matrix (mpeg2dec); | 777 | finalize_matrix (mpeg2dec); |
616 | decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE; | 778 | decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE; |
617 | 779 | ||
618 | if (mpeg2dec->state == STATE_PICTURE) { | 780 | if (mpeg2dec->state == STATE_PICTURE) |
781 | { | ||
619 | mpeg2_picture_t * picture; | 782 | mpeg2_picture_t * picture; |
620 | mpeg2_picture_t * other; | 783 | mpeg2_picture_t * other; |
621 | 784 | ||
622 | decoder->second_field = 0; | 785 | decoder->second_field = 0; |
623 | 786 | ||
624 | picture = other = mpeg2dec->pictures; | 787 | picture = other = mpeg2dec->pictures; |
788 | |||
625 | if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2)) | 789 | if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2)) |
626 | picture += 2; | 790 | picture += 2; |
627 | else | 791 | else |
628 | other += 2; | 792 | other += 2; |
793 | |||
629 | mpeg2dec->picture = picture; | 794 | mpeg2dec->picture = picture; |
630 | *picture = mpeg2dec->new_picture; | 795 | *picture = mpeg2dec->new_picture; |
631 | 796 | ||
632 | if (!old_type_b) { | 797 | if (!old_type_b) |
798 | { | ||
633 | mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1]; | 799 | mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1]; |
634 | mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0]; | 800 | mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0]; |
635 | } | 801 | } |
802 | |||
636 | mpeg2dec->fbuf[0] = NULL; | 803 | mpeg2dec->fbuf[0] = NULL; |
637 | mpeg2_reset_info (&(mpeg2dec->info)); | 804 | mpeg2_reset_info (&mpeg2dec->info); |
638 | mpeg2dec->info.current_picture = picture; | 805 | mpeg2dec->info.current_picture = picture; |
639 | mpeg2dec->info.display_picture = picture; | 806 | mpeg2dec->info.display_picture = picture; |
640 | if (decoder->coding_type != B_TYPE) { | 807 | |
641 | if (!low_delay) { | 808 | if (decoder->coding_type != B_TYPE) |
642 | if (mpeg2dec->first) { | 809 | { |
810 | if (!low_delay) | ||
811 | { | ||
812 | if (mpeg2dec->first) | ||
813 | { | ||
643 | mpeg2dec->info.display_picture = NULL; | 814 | mpeg2dec->info.display_picture = NULL; |
644 | mpeg2dec->first = 0; | 815 | mpeg2dec->first = 0; |
645 | } else { | 816 | } |
817 | else | ||
818 | { | ||
646 | mpeg2dec->info.display_picture = other; | 819 | mpeg2dec->info.display_picture = other; |
820 | |||
647 | if (other->nb_fields == 1) | 821 | if (other->nb_fields == 1) |
648 | mpeg2dec->info.display_picture_2nd = other + 1; | 822 | mpeg2dec->info.display_picture_2nd = other + 1; |
823 | |||
649 | mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1]; | 824 | mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1]; |
650 | } | 825 | } |
651 | } | 826 | } |
827 | |||
652 | if (!low_delay + !mpeg2dec->convert) | 828 | if (!low_delay + !mpeg2dec->convert) |
829 | { | ||
653 | mpeg2dec->info.discard_fbuf = | 830 | mpeg2dec->info.discard_fbuf = |
654 | mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert]; | 831 | mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert]; |
832 | } | ||
655 | } | 833 | } |
656 | if (mpeg2dec->convert) { | 834 | |
835 | if (mpeg2dec->convert) | ||
836 | { | ||
657 | mpeg2_convert_init_t convert_init; | 837 | mpeg2_convert_init_t convert_init; |
658 | if (!mpeg2dec->convert_start) { | 838 | |
839 | if (!mpeg2dec->convert_start) | ||
840 | { | ||
659 | int y_size, uv_size; | 841 | int y_size, uv_size; |
660 | 842 | ||
661 | mpeg2dec->decoder.convert_id = | 843 | mpeg2dec->decoder.convert_id = |
662 | mpeg2_malloc (mpeg2dec->convert_id_size, | 844 | mpeg2_malloc (mpeg2dec->convert_id_size, |
663 | MPEG2_ALLOC_CONVERT_ID); | 845 | MPEG2_ALLOC_CONVERT_ID); |
846 | |||
664 | mpeg2dec->convert (MPEG2_CONVERT_START, | 847 | mpeg2dec->convert (MPEG2_CONVERT_START, |
665 | mpeg2dec->decoder.convert_id, | 848 | mpeg2dec->decoder.convert_id, |
666 | &(mpeg2dec->sequence), | 849 | &mpeg2dec->sequence, |
667 | mpeg2dec->convert_stride, | 850 | mpeg2dec->convert_stride, |
668 | mpeg2dec->convert_arg, &convert_init); | 851 | mpeg2dec->convert_arg, &convert_init); |
852 | |||
669 | mpeg2dec->convert_start = convert_init.start; | 853 | mpeg2dec->convert_start = convert_init.start; |
670 | mpeg2dec->decoder.convert = convert_init.copy; | 854 | mpeg2dec->decoder.convert = convert_init.copy; |
671 | 855 | ||
672 | y_size = decoder->stride_frame * mpeg2dec->sequence.height; | 856 | y_size = decoder->stride_frame * mpeg2dec->sequence.height; |
673 | uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format); | 857 | uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format); |
858 | |||
674 | mpeg2dec->yuv_buf[0][0] = | 859 | mpeg2dec->yuv_buf[0][0] = |
675 | (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV); | 860 | (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV); |
676 | mpeg2dec->yuv_buf[0][1] = | 861 | mpeg2dec->yuv_buf[0][1] = |
677 | (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); | 862 | (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV); |
678 | mpeg2dec->yuv_buf[0][2] = | 863 | mpeg2dec->yuv_buf[0][2] = |
679 | (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); | 864 | (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV); |
865 | |||
680 | mpeg2dec->yuv_buf[1][0] = | 866 | mpeg2dec->yuv_buf[1][0] = |
681 | (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV); | 867 | (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV); |
682 | mpeg2dec->yuv_buf[1][1] = | 868 | mpeg2dec->yuv_buf[1][1] = |
683 | (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); | 869 | (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV); |
684 | mpeg2dec->yuv_buf[1][2] = | 870 | mpeg2dec->yuv_buf[1][2] = |
685 | (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); | 871 | (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV); |
872 | |||
686 | y_size = decoder->stride_frame * 32; | 873 | y_size = decoder->stride_frame * 32; |
687 | uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format); | 874 | uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format); |
875 | |||
688 | mpeg2dec->yuv_buf[2][0] = | 876 | mpeg2dec->yuv_buf[2][0] = |
689 | (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV); | 877 | (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV); |
690 | mpeg2dec->yuv_buf[2][1] = | 878 | mpeg2dec->yuv_buf[2][1] = |
691 | (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); | 879 | (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV); |
692 | mpeg2dec->yuv_buf[2][2] = | 880 | mpeg2dec->yuv_buf[2][2] = |
693 | (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); | 881 | (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV); |
694 | } | 882 | } |
695 | if (!mpeg2dec->custom_fbuf) { | 883 | |
696 | while (mpeg2dec->alloc_index < 3) { | 884 | if (!mpeg2dec->custom_fbuf) |
885 | { | ||
886 | while (mpeg2dec->alloc_index < 3) | ||
887 | { | ||
697 | mpeg2_fbuf_t * fbuf; | 888 | mpeg2_fbuf_t * fbuf; |
698 | 889 | ||
699 | fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf; | 890 | fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf; |
700 | fbuf->id = NULL; | 891 | fbuf->id = NULL; |
892 | |||
701 | fbuf->buf[0] = | 893 | fbuf->buf[0] = |
702 | (uint8_t *) mpeg2_malloc (convert_init.buf_size[0], | 894 | (uint8_t *) mpeg2_malloc (convert_init.buf_size[0], |
703 | MPEG2_ALLOC_CONVERTED); | 895 | MPEG2_ALLOC_CONVERTED); |
@@ -710,15 +902,21 @@ void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec) | |||
710 | } | 902 | } |
711 | mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE)); | 903 | mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE)); |
712 | } | 904 | } |
713 | } else if (!mpeg2dec->custom_fbuf) { | 905 | } |
714 | while (mpeg2dec->alloc_index < 3) { | 906 | else if (!mpeg2dec->custom_fbuf) |
907 | { | ||
908 | while (mpeg2dec->alloc_index < 3) | ||
909 | { | ||
715 | mpeg2_fbuf_t * fbuf; | 910 | mpeg2_fbuf_t * fbuf; |
716 | int y_size, uv_size; | 911 | int y_size, uv_size; |
717 | 912 | ||
718 | fbuf = &(mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf); | 913 | fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf; |
914 | |||
719 | fbuf->id = NULL; | 915 | fbuf->id = NULL; |
916 | |||
720 | y_size = decoder->stride_frame * mpeg2dec->sequence.height; | 917 | y_size = decoder->stride_frame * mpeg2dec->sequence.height; |
721 | uv_size = y_size >> (2 - decoder->chroma_format); | 918 | uv_size = y_size >> (2 - decoder->chroma_format); |
919 | |||
722 | fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size, | 920 | fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size, |
723 | MPEG2_ALLOC_YUV); | 921 | MPEG2_ALLOC_YUV); |
724 | fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size, | 922 | fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size, |
@@ -726,13 +924,19 @@ void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec) | |||
726 | fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size, | 924 | fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size, |
727 | MPEG2_ALLOC_YUV); | 925 | MPEG2_ALLOC_YUV); |
728 | } | 926 | } |
927 | |||
729 | mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE)); | 928 | mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE)); |
730 | } | 929 | } |
731 | } else { | 930 | } |
931 | else | ||
932 | { | ||
732 | decoder->second_field = 1; | 933 | decoder->second_field = 1; |
733 | mpeg2dec->picture++; /* second field picture */ | 934 | mpeg2dec->picture++; /* second field picture */ |
935 | |||
734 | *(mpeg2dec->picture) = mpeg2dec->new_picture; | 936 | *(mpeg2dec->picture) = mpeg2dec->new_picture; |
937 | |||
735 | mpeg2dec->info.current_picture_2nd = mpeg2dec->picture; | 938 | mpeg2dec->info.current_picture_2nd = mpeg2dec->picture; |
939 | |||
736 | if (low_delay || decoder->coding_type == B_TYPE) | 940 | if (low_delay || decoder->coding_type == B_TYPE) |
737 | mpeg2dec->info.display_picture_2nd = mpeg2dec->picture; | 941 | mpeg2dec->info.display_picture_2nd = mpeg2dec->picture; |
738 | } | 942 | } |
@@ -752,23 +956,38 @@ static int quant_matrix_ext (mpeg2dec_t * mpeg2dec) | |||
752 | int i, j; | 956 | int i, j; |
753 | 957 | ||
754 | for (i = 0; i < 4; i++) | 958 | for (i = 0; i < 4; i++) |
755 | if (buffer[0] & (8 >> i)) { | 959 | { |
960 | if (buffer[0] & (8 >> i)) | ||
961 | { | ||
756 | for (j = 0; j < 64; j++) | 962 | for (j = 0; j < 64; j++) |
963 | { | ||
757 | mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] = | 964 | mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] = |
758 | (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i)); | 965 | (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i)); |
966 | } | ||
967 | |||
759 | mpeg2dec->copy_matrix |= 1 << i; | 968 | mpeg2dec->copy_matrix |= 1 << i; |
760 | buffer += 64; | 969 | buffer += 64; |
761 | } | 970 | } |
971 | } | ||
762 | 972 | ||
763 | return 0; | 973 | return 0; |
764 | } | 974 | } |
765 | 975 | ||
766 | int mpeg2_header_extension (mpeg2dec_t * mpeg2dec) | 976 | int mpeg2_header_extension (mpeg2dec_t * mpeg2dec) |
767 | { | 977 | { |
768 | static int (* parser[]) (mpeg2dec_t *) = { | 978 | static int (* const parser[9]) (mpeg2dec_t *) = |
769 | 0, sequence_ext, sequence_display_ext, quant_matrix_ext, | 979 | { |
770 | copyright_ext, 0, 0, picture_display_ext, picture_coding_ext | 980 | NULL, |
981 | sequence_ext, | ||
982 | sequence_display_ext, | ||
983 | quant_matrix_ext, | ||
984 | copyright_ext, | ||
985 | NULL, | ||
986 | NULL, | ||
987 | picture_display_ext, | ||
988 | picture_coding_ext | ||
771 | }; | 989 | }; |
990 | |||
772 | int ext, ext_bit; | 991 | int ext, ext_bit; |
773 | 992 | ||
774 | ext = mpeg2dec->chunk_start[0] >> 4; | 993 | ext = mpeg2dec->chunk_start[0] >> 4; |
@@ -776,7 +995,9 @@ int mpeg2_header_extension (mpeg2dec_t * mpeg2dec) | |||
776 | 995 | ||
777 | if (!(mpeg2dec->ext_state & ext_bit)) | 996 | if (!(mpeg2dec->ext_state & ext_bit)) |
778 | return 0; /* ignore illegal extensions */ | 997 | return 0; /* ignore illegal extensions */ |
998 | |||
779 | mpeg2dec->ext_state &= ~ext_bit; | 999 | mpeg2dec->ext_state &= ~ext_bit; |
1000 | |||
780 | return parser[ext] (mpeg2dec); | 1001 | return parser[ext] (mpeg2dec); |
781 | } | 1002 | } |
782 | 1003 | ||
@@ -784,89 +1005,119 @@ int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec) | |||
784 | { | 1005 | { |
785 | mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start; | 1006 | mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start; |
786 | mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1; | 1007 | mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1; |
787 | 1008 | ||
788 | return 0; | 1009 | return 0; |
789 | } | 1010 | } |
790 | 1011 | ||
791 | static void prescale (mpeg2dec_t * mpeg2dec, int index) | 1012 | static void prescale (mpeg2dec_t * mpeg2dec, int index) |
792 | { | 1013 | { |
793 | static int non_linear_scale [] = { | 1014 | static const int non_linear_scale[32] = |
1015 | { | ||
794 | 0, 1, 2, 3, 4, 5, 6, 7, | 1016 | 0, 1, 2, 3, 4, 5, 6, 7, |
795 | 8, 10, 12, 14, 16, 18, 20, 22, | 1017 | 8, 10, 12, 14, 16, 18, 20, 22, |
796 | 24, 28, 32, 36, 40, 44, 48, 52, | 1018 | 24, 28, 32, 36, 40, 44, 48, 52, |
797 | 56, 64, 72, 80, 88, 96, 104, 112 | 1019 | 56, 64, 72, 80, 88, 96, 104, 112 |
798 | }; | 1020 | }; |
1021 | |||
799 | int i, j, k; | 1022 | int i, j, k; |
800 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 1023 | mpeg2_decoder_t * decoder = &mpeg2dec->decoder; |
801 | 1024 | ||
802 | if (mpeg2dec->scaled[index] != mpeg2dec->q_scale_type) { | 1025 | if (mpeg2dec->scaled[index] != mpeg2dec->q_scale_type) |
1026 | { | ||
803 | mpeg2dec->scaled[index] = mpeg2dec->q_scale_type; | 1027 | mpeg2dec->scaled[index] = mpeg2dec->q_scale_type; |
804 | for (i = 0; i < 32; i++) { | 1028 | |
1029 | for (i = 0; i < 32; i++) | ||
1030 | { | ||
805 | k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1); | 1031 | k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1); |
1032 | |||
806 | for (j = 0; j < 64; j++) | 1033 | for (j = 0; j < 64; j++) |
1034 | { | ||
807 | decoder->quantizer_prescale[index][i][j] = | 1035 | decoder->quantizer_prescale[index][i][j] = |
808 | k * mpeg2dec->quantizer_matrix[index][j]; | 1036 | k * mpeg2dec->quantizer_matrix[index][j]; |
1037 | } | ||
809 | } | 1038 | } |
810 | } | 1039 | } |
811 | } | 1040 | } |
812 | 1041 | ||
813 | mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec) | 1042 | mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec) |
814 | { | 1043 | { |
815 | mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); | 1044 | mpeg2_decoder_t * decoder = &mpeg2dec->decoder; |
816 | 1045 | ||
817 | mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0; | 1046 | mpeg2dec->info.user_data = NULL; |
818 | mpeg2dec->state = ((mpeg2dec->picture->nb_fields > 1 || | 1047 | mpeg2dec->info.user_data_len = 0; |
819 | mpeg2dec->state == STATE_PICTURE_2ND) ? | 1048 | mpeg2dec->state = (mpeg2dec->picture->nb_fields > 1 || |
820 | STATE_SLICE : STATE_SLICE_1ST); | 1049 | mpeg2dec->state == STATE_PICTURE_2ND) ? |
1050 | STATE_SLICE : STATE_SLICE_1ST; | ||
821 | 1051 | ||
822 | if (mpeg2dec->decoder.coding_type != D_TYPE) { | 1052 | if (mpeg2dec->decoder.coding_type != D_TYPE) |
1053 | { | ||
823 | prescale (mpeg2dec, 0); | 1054 | prescale (mpeg2dec, 0); |
1055 | |||
824 | if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2]) | 1056 | if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2]) |
825 | prescale (mpeg2dec, 2); | 1057 | prescale (mpeg2dec, 2); |
826 | if (mpeg2dec->decoder.coding_type != I_TYPE) { | 1058 | |
1059 | if (mpeg2dec->decoder.coding_type != I_TYPE) | ||
1060 | { | ||
827 | prescale (mpeg2dec, 1); | 1061 | prescale (mpeg2dec, 1); |
1062 | |||
828 | if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3]) | 1063 | if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3]) |
829 | prescale (mpeg2dec, 3); | 1064 | prescale (mpeg2dec, 3); |
830 | } | 1065 | } |
831 | } | 1066 | } |
832 | 1067 | ||
833 | if (!(mpeg2dec->nb_decode_slices)) | 1068 | if (!(mpeg2dec->nb_decode_slices)) |
1069 | { | ||
834 | mpeg2dec->picture->flags |= PIC_FLAG_SKIP; | 1070 | mpeg2dec->picture->flags |= PIC_FLAG_SKIP; |
835 | else if (mpeg2dec->convert_start) { | 1071 | } |
1072 | else if (mpeg2dec->convert_start) | ||
1073 | { | ||
836 | mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0], | 1074 | mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0], |
837 | mpeg2dec->picture, mpeg2dec->info.gop); | 1075 | mpeg2dec->picture, mpeg2dec->info.gop); |
838 | 1076 | ||
839 | if (mpeg2dec->decoder.coding_type == B_TYPE) | 1077 | if (mpeg2dec->decoder.coding_type == B_TYPE) |
840 | mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->yuv_buf[2], | 1078 | { |
1079 | mpeg2_init_fbuf (&mpeg2dec->decoder, mpeg2dec->yuv_buf[2], | ||
841 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1], | 1080 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1], |
842 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index]); | 1081 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index]); |
843 | else { | 1082 | } |
844 | mpeg2_init_fbuf (&(mpeg2dec->decoder), | 1083 | else |
1084 | { | ||
1085 | mpeg2_init_fbuf (&mpeg2dec->decoder, | ||
845 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1], | 1086 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1], |
846 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index], | 1087 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index], |
847 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index]); | 1088 | mpeg2dec->yuv_buf[mpeg2dec->yuv_index]); |
1089 | |||
848 | if (mpeg2dec->state == STATE_SLICE) | 1090 | if (mpeg2dec->state == STATE_SLICE) |
849 | mpeg2dec->yuv_index ^= 1; | 1091 | mpeg2dec->yuv_index ^= 1; |
850 | } | 1092 | } |
851 | } else { | 1093 | } |
1094 | else | ||
1095 | { | ||
852 | int b_type; | 1096 | int b_type; |
853 | 1097 | ||
854 | b_type = (mpeg2dec->decoder.coding_type == B_TYPE); | 1098 | b_type = (mpeg2dec->decoder.coding_type == B_TYPE); |
855 | mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->fbuf[0]->buf, | 1099 | |
1100 | mpeg2_init_fbuf (&mpeg2dec->decoder, mpeg2dec->fbuf[0]->buf, | ||
856 | mpeg2dec->fbuf[b_type + 1]->buf, | 1101 | mpeg2dec->fbuf[b_type + 1]->buf, |
857 | mpeg2dec->fbuf[b_type]->buf); | 1102 | mpeg2dec->fbuf[b_type]->buf); |
858 | } | 1103 | } |
1104 | |||
859 | mpeg2dec->action = NULL; | 1105 | mpeg2dec->action = NULL; |
1106 | |||
860 | return (mpeg2_state_t)-1; | 1107 | return (mpeg2_state_t)-1; |
861 | } | 1108 | } |
862 | 1109 | ||
863 | static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec) | 1110 | static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec) |
864 | { | 1111 | { |
865 | mpeg2_reset_info (&(mpeg2dec->info)); | 1112 | mpeg2_reset_info (&mpeg2dec->info); |
1113 | |||
866 | mpeg2dec->info.sequence = NULL; | 1114 | mpeg2dec->info.sequence = NULL; |
867 | mpeg2dec->info.gop = NULL; | 1115 | mpeg2dec->info.gop = NULL; |
1116 | |||
868 | mpeg2_header_state_init (mpeg2dec); | 1117 | mpeg2_header_state_init (mpeg2dec); |
1118 | |||
869 | mpeg2dec->action = mpeg2_seek_header; | 1119 | mpeg2dec->action = mpeg2_seek_header; |
1120 | |||
870 | return mpeg2_seek_header (mpeg2dec); | 1121 | return mpeg2_seek_header (mpeg2dec); |
871 | } | 1122 | } |
872 | 1123 | ||
@@ -877,19 +1128,30 @@ mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec) | |||
877 | 1128 | ||
878 | b_type = (mpeg2dec->decoder.coding_type == B_TYPE); | 1129 | b_type = (mpeg2dec->decoder.coding_type == B_TYPE); |
879 | picture = mpeg2dec->pictures; | 1130 | picture = mpeg2dec->pictures; |
1131 | |||
880 | if ((mpeg2dec->picture >= picture + 2) ^ b_type) | 1132 | if ((mpeg2dec->picture >= picture + 2) ^ b_type) |
881 | picture = mpeg2dec->pictures + 2; | 1133 | picture = mpeg2dec->pictures + 2; |
882 | 1134 | ||
883 | mpeg2_reset_info (&(mpeg2dec->info)); | 1135 | mpeg2_reset_info (&mpeg2dec->info); |
884 | if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) { | 1136 | |
1137 | if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) | ||
1138 | { | ||
885 | mpeg2dec->info.display_picture = picture; | 1139 | mpeg2dec->info.display_picture = picture; |
1140 | |||
886 | if (picture->nb_fields == 1) | 1141 | if (picture->nb_fields == 1) |
887 | mpeg2dec->info.display_picture_2nd = picture + 1; | 1142 | mpeg2dec->info.display_picture_2nd = picture + 1; |
1143 | |||
888 | mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type]; | 1144 | mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type]; |
1145 | |||
889 | if (!mpeg2dec->convert) | 1146 | if (!mpeg2dec->convert) |
890 | mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1]; | 1147 | mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1]; |
891 | } else if (!mpeg2dec->convert) | 1148 | } |
1149 | else if (!mpeg2dec->convert) | ||
1150 | { | ||
892 | mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type]; | 1151 | mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type]; |
1152 | } | ||
1153 | |||
893 | mpeg2dec->action = seek_sequence; | 1154 | mpeg2dec->action = seek_sequence; |
1155 | |||
894 | return STATE_END; | 1156 | return STATE_END; |
895 | } | 1157 | } |