Update for changes from r19139 and r19137.
[mplayer.git] / libmpeg2 / libmpeg-0.4.0.diff
1 --- include/attributes.h        2006-06-16 20:12:26.000000000 +0200
2 +++ libmpeg2/attributes.h       2006-06-16 20:12:50.000000000 +0200
3 @@ -25,7 +29,7 @@
4  #ifdef ATTRIBUTE_ALIGNED_MAX
5  #define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align)))
6  #else
7 -#define ATTR_ALIGN(align)
8 +#define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((16 < align) ? 16 : align)))
9  #endif
10  
11  #ifdef HAVE_BUILTIN_EXPECT
12 --- libmpeg2/cpu_accel.c        2006-06-16 20:12:26.000000000 +0200
13 +++ libmpeg2/cpu_accel.c        2006-06-16 20:12:50.000000000 +0200
14 @@ -22,6 +26,7 @@
15   */
16  
17  #include "config.h"
18 +#include "cpudetect.h"
19  
20  #include <inttypes.h>
21  
22 @@ -30,9 +35,17 @@
23  #include "mpeg2_internal.h"
24  
25  #ifdef ACCEL_DETECT
26 -#ifdef ARCH_X86
27 +#if defined(ARCH_X86) || defined(ARCH_X86_64)
28 +
29 +/* MPlayer imports libmpeg2 as decoder, which detects MMX / 3DNow! 
30 + * instructions via assembly. However, it is regarded as duplicaed work
31 + * in MPlayer, so that we enforce to use MPlayer's implementation.
32 + */
33 +#define USE_MPLAYER_CPUDETECT
34 +
35  static inline uint32_t arch_accel (void)
36  {
37 +#if !defined(USE_MPLAYER_CPUDETECT)
38      uint32_t eax, ebx, ecx, edx;
39      int AMD;
40      uint32_t caps;
41 @@ -105,10 +118,24 @@
42         caps |= MPEG2_ACCEL_X86_MMXEXT;
43  
44      return caps;
45 +#else /* USE_MPLAYER_CPUDETECT: Use MPlayer's cpu capability property */
46 +    caps = 0;
47 +    if (gCpuCaps.hasMMX)
48 +        caps |= MPEG2_ACCEL_X86_MMX;
49 +    if (gCpuCaps.hasSSE2)
50 +       caps |= MPEG2_ACCEL_X86_SSE2;
51 +    if (gCpuCaps.hasMMX2)
52 +       caps |= MPEG2_ACCEL_X86_MMXEXT;
53 +    if (gCpuCaps.has3DNow)
54 +       caps |= MPEG2_ACCEL_X86_3DNOW;
55 +
56 +    return caps;
57 +
58 +#endif /* USE_MPLAYER_CPUDETECT */
59  }
60 -#endif /* ARCH_X86 */
61 +#endif /* ARCH_X86 || ARCH_X86_64 */
62  
63 -#if defined(ARCH_PPC) || defined(ARCH_SPARC)
64 +#if defined(ARCH_PPC) || (defined(ARCH_SPARC) && defined(HAVE_VIS))
65  #include <signal.h>
66  #include <setjmp.h>
67  
68 @@ -195,6 +222,7 @@
69  #ifdef ARCH_ALPHA
70  static inline uint32_t arch_accel (void)
71  {
72 +#ifdef CAN_COMPILE_ALPHA_MVI
73      uint64_t no_mvi;
74  
75      asm volatile ("amask %1, %0"
76 @@ -202,6 +230,9 @@
77                   : "rI" (256));        /* AMASK_MVI */
78      return no_mvi ? MPEG2_ACCEL_ALPHA : (MPEG2_ACCEL_ALPHA |
79                                          MPEG2_ACCEL_ALPHA_MVI);
80 +#else
81 +    return MPEG2_ACCEL_ALPHA;
82 +#endif
83  }
84  #endif /* ARCH_ALPHA */
85  #endif /* ACCEL_DETECT */
86 @@ -212,7 +243,7 @@
87  
88      accel = 0;
89  #ifdef ACCEL_DETECT
90 -#if defined (ARCH_X86) || defined (ARCH_PPC) || defined (ARCH_ALPHA) || defined (ARCH_SPARC)
91 +#if defined (ARCH_X86) || defined (ARCH_X86_64) || defined (ARCH_PPC) || defined (ARCH_ALPHA) || defined (ARCH_SPARC)
92      accel = arch_accel ();
93  #endif
94  #endif
95 --- libmpeg2/cpu_state.c        2006-06-16 20:12:26.000000000 +0200
96 +++ libmpeg2/cpu_state.c        2006-06-16 20:12:50.000000000 +0200
97 @@ -29,14 +33,14 @@
98  #include "mpeg2.h"
99  #include "attributes.h"
100  #include "mpeg2_internal.h"
101 -#ifdef ARCH_X86
102 +#if defined(ARCH_X86) || defined(ARCH_X86_64)
103  #include "mmx.h"
104  #endif
105  
106  void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL;
107  void (* mpeg2_cpu_state_restore) (cpu_state_t * state) = NULL;
108  
109 -#ifdef ARCH_X86
110 +#if defined(ARCH_X86) || defined(ARCH_X86_64)
111  static void state_restore_mmx (cpu_state_t * state)
112  {
113      emms ();
114 @@ -115,12 +119,12 @@
115  
116  void mpeg2_cpu_state_init (uint32_t accel)
117  {
118 -#ifdef ARCH_X86
119 +#if defined(ARCH_X86) || defined(ARCH_X86_64)
120      if (accel & MPEG2_ACCEL_X86_MMX) {
121         mpeg2_cpu_state_restore = state_restore_mmx;
122      }
123  #endif
124 -#ifdef ARCH_PPC
125 +#if defined(ARCH_PPC) && defined(HAVE_ALTIVEC)
126      if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
127         mpeg2_cpu_state_save = state_save_altivec;
128         mpeg2_cpu_state_restore = state_restore_altivec;
129 --- libmpeg2/decode.c   2006-06-16 20:12:26.000000000 +0200
130 +++ libmpeg2/decode.c   2006-06-16 20:12:50.000000000 +0200
131 @@ -351,6 +355,15 @@
132      fbuf->buf[1] = buf[1];
133      fbuf->buf[2] = buf[2];
134      fbuf->id = id;
135 +    // HACK! FIXME! At first I frame, copy pointers to prediction frame too!
136 +    if (mpeg2dec->custom_fbuf && !mpeg2dec->fbuf[1]->buf[0]){
137 +       mpeg2dec->fbuf[1]->buf[0]=buf[0];
138 +       mpeg2dec->fbuf[1]->buf[1]=buf[1];
139 +       mpeg2dec->fbuf[1]->buf[2]=buf[2];
140 +       mpeg2dec->fbuf[1]->id=NULL;
141 +    }
142 +//        printf("libmpeg2: FBUF 0:%p 1:%p 2:%p\n",
143 +//         mpeg2dec->fbuf[0]->buf[0],mpeg2dec->fbuf[1]->buf[0],mpeg2dec->fbuf[2]->buf[0]);
144  }
145  
146  void mpeg2_custom_fbuf (mpeg2dec_t * mpeg2dec, int custom_fbuf)
147 --- libmpeg2/header.c   2006-06-16 20:12:26.000000000 +0200
148 +++ libmpeg2/header.c   2006-06-16 20:12:50.000000000 +0200
149 @@ -100,6 +104,9 @@
150      mpeg2dec->decoder.convert = NULL;
151      mpeg2dec->decoder.convert_id = NULL;
152      mpeg2dec->picture = mpeg2dec->pictures;
153 +    memset(&mpeg2dec->fbuf_alloc[0].fbuf, 0, sizeof(mpeg2_fbuf_t));
154 +    memset(&mpeg2dec->fbuf_alloc[1].fbuf, 0, sizeof(mpeg2_fbuf_t));
155 +    memset(&mpeg2dec->fbuf_alloc[2].fbuf, 0, sizeof(mpeg2_fbuf_t));
156      mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf;
157      mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf;
158      mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf;
159 @@ -551,6 +558,7 @@
160         if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) {
161             picture->nb_fields = (buffer[3] & 2) ? 3 : 2;
162             flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0;
163 +           flags |= (buffer[3] &   2) ? PIC_FLAG_REPEAT_FIRST_FIELD : 0;
164         } else
165             picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2;
166         break;
167 @@ -799,6 +807,7 @@
168         mpeg2dec->scaled[index] = mpeg2dec->q_scale_type;
169         for (i = 0; i < 32; i++) {
170             k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1);
171 +           decoder->quantizer_scales[i] = k;
172             for (j = 0; j < 64; j++)
173                 decoder->quantizer_prescale[index][i][j] =
174                     k * mpeg2dec->quantizer_matrix[index][j];
175 --- libmpeg2/idct.c     2006-06-16 20:12:26.000000000 +0200
176 +++ libmpeg2/idct.c     2006-06-16 20:12:50.000000000 +0200
177 @@ -66,7 +70,7 @@
178  } while (0)
179  #endif
180  
181 -static void inline idct_row (int16_t * const block)
182 +static inline void idct_row (int16_t * const block)
183  {
184      int d0, d1, d2, d3;
185      int a0, a1, a2, a3, b0, b1, b2, b3;
186 @@ -119,7 +123,7 @@
187      block[7] = (a0 - b0) >> 12;
188  }
189  
190 -static void inline idct_col (int16_t * const block)
191 +static inline void idct_col (int16_t * const block)
192  {
193      int d0, d1, d2, d3;
194      int a0, a1, a2, a3, b0, b1, b2, b3;
195 @@ -239,12 +239,15 @@
196  
197  void mpeg2_idct_init (uint32_t accel)
198  {
199 -#ifdef ARCH_X86
200 +#ifdef HAVE_MMX2
201      if (accel & MPEG2_ACCEL_X86_MMXEXT) {
202         mpeg2_idct_copy = mpeg2_idct_copy_mmxext;
203         mpeg2_idct_add = mpeg2_idct_add_mmxext;
204         mpeg2_idct_mmx_init ();
205 -    } else if (accel & MPEG2_ACCEL_X86_MMX) {
206 +    } else
207 +#endif
208 +#ifdef HAVE_MMX
209 +    if (accel & MPEG2_ACCEL_X86_MMX) {
210         mpeg2_idct_copy = mpeg2_idct_copy_mmx;
211         mpeg2_idct_add = mpeg2_idct_add_mmx;
212         mpeg2_idct_mmx_init ();
213 @@ -254,11 +261,14 @@
214      } else
215  #endif
216  #ifdef ARCH_ALPHA
217 +#ifdef CAN_COMPILE_ALPHA_MVI
218      if (accel & MPEG2_ACCEL_ALPHA_MVI) {
219         mpeg2_idct_copy = mpeg2_idct_copy_mvi;
220         mpeg2_idct_add = mpeg2_idct_add_mvi;
221         mpeg2_idct_alpha_init ();
222 -    } else if (accel & MPEG2_ACCEL_ALPHA) {
223 +    } else
224 +#endif
225 +    if (accel & MPEG2_ACCEL_ALPHA) {
226         int i;
227  
228         mpeg2_idct_copy = mpeg2_idct_copy_alpha;
229 --- libmpeg2/idct_alpha.c       2006-06-16 20:12:26.000000000 +0200
230 +++ libmpeg2/idct_alpha.c       2006-06-16 20:12:50.000000000 +0200
231 @@ -59,7 +63,7 @@
232  } while (0)
233  #endif
234  
235 -static void inline idct_row (int16_t * const block)
236 +static inline void idct_row (int16_t * const block)
237  {
238      uint64_t l, r;
239      int_fast32_t d0, d1, d2, d3;
240 @@ -116,7 +120,7 @@
241      block[7] = (a0 - b0) >> 12;
242  }
243  
244 -static void inline idct_col (int16_t * const block)
245 +static inline void idct_col (int16_t * const block)
246  {
247      int_fast32_t d0, d1, d2, d3;
248      int_fast32_t a0, a1, a2, a3, b0, b1, b2, b3;
249 @@ -157,6 +161,7 @@
250      block[8*7] = (a0 - b0) >> 17;
251  }
252  
253 +#ifdef CAN_COMPILE_ALPHA_MVI
254  void mpeg2_idct_copy_mvi (int16_t * block, uint8_t * dest, const int stride)
255  {
256      uint64_t clampmask;
257 @@ -289,6 +294,7 @@
258         stq (p7, dest + 7 * stride);
259      }
260  }
261 +#endif
262  
263  void mpeg2_idct_copy_alpha (int16_t * block, uint8_t * dest, const int stride)
264  {
265 --- libmpeg2/idct_mmx.c 2006-06-16 20:12:26.000000000 +0200
266 +++ libmpeg2/idct_mmx.c 2006-06-16 20:12:50.000000000 +0200
267 @@ -23,7 +27,7 @@
268  
269  #include "config.h"
270  
271 -#ifdef ARCH_X86
272 +#if defined(ARCH_X86) || defined(ARCH_X86_64)
273  
274  #include <inttypes.h>
275  
276 --- libmpeg2/motion_comp.c      2006-06-16 20:12:26.000000000 +0200
277 +++ libmpeg2/motion_comp.c      2006-06-16 20:12:50.000000000 +0200
278 @@ -37,16 +37,22 @@
279  
280  void mpeg2_mc_init (uint32_t accel)
281  {
282 -#ifdef ARCH_X86
283 +#ifdef HAVE_MMX2
284      if (accel & MPEG2_ACCEL_X86_MMXEXT)
285         mpeg2_mc = mpeg2_mc_mmxext;
286 -    else if (accel & MPEG2_ACCEL_X86_3DNOW)
287 +    else
288 +#endif
289 +#ifdef HAVE_3DNOW
290 +    if (accel & MPEG2_ACCEL_X86_3DNOW)
291         mpeg2_mc = mpeg2_mc_3dnow;
292 -    else if (accel & MPEG2_ACCEL_X86_MMX)
293 +    else
294 +#endif
295 +#ifdef HAVE_MMX
296 +    if (accel & MPEG2_ACCEL_X86_MMX)
297         mpeg2_mc = mpeg2_mc_mmx;
298 -    elseo
299 +    else
300  #endif
301 -#ifdef ARCH_PPC
302 +#if defined(ARCH_PPC) && defined(HAVE_ALTIVEC)
303      if (accel & MPEG2_ACCEL_PPC_ALTIVEC)
304         mpeg2_mc = mpeg2_mc_altivec;
305      else
306 @@ -52,7 +62,7 @@
307         mpeg2_mc = mpeg2_mc_alpha;
308      else
309  #endif
310 -#ifdef ARCH_SPARC
311 +#if defined(ARCH_SPARC) && defined(HAVE_VIS)
312      if (accel & MPEG2_ACCEL_SPARC_VIS)
313         mpeg2_mc = mpeg2_mc_vis;
314      else
315 --- libmpeg2/motion_comp_mmx.c  2006-06-16 20:12:26.000000000 +0200
316 +++ libmpeg2/motion_comp_mmx.c  2006-06-16 20:12:50.000000000 +0200
317 @@ -23,7 +27,7 @@
318  
319  #include "config.h"
320  
321 -#ifdef ARCH_X86
322 +#if defined(ARCH_X86) || defined(ARCH_X86_64)
323  
324  #include <inttypes.h>
325  
326 --- include/mpeg2.h     2006-06-16 20:12:26.000000000 +0200
327 +++ libmpeg2/mpeg2.h    2006-06-16 20:12:50.000000000 +0200
328 @@ -82,6 +86,7 @@
329  #define PIC_FLAG_COMPOSITE_DISPLAY 32
330  #define PIC_FLAG_SKIP 64
331  #define PIC_FLAG_TAGS 128
332 +#define PIC_FLAG_REPEAT_FIRST_FIELD 256
333  #define PIC_MASK_COMPOSITE_DISPLAY 0xfffff000
334  
335  typedef struct mpeg2_picture_s {
336 @@ -154,6 +159,7 @@
337  #define MPEG2_ACCEL_X86_MMX 1
338  #define MPEG2_ACCEL_X86_3DNOW 2
339  #define MPEG2_ACCEL_X86_MMXEXT 4
340 +#define MPEG2_ACCEL_X86_SSE2 8
341  #define MPEG2_ACCEL_PPC_ALTIVEC 1
342  #define MPEG2_ACCEL_ALPHA 1
343  #define MPEG2_ACCEL_ALPHA_MVI 2
344 --- libmpeg2/mpeg2_internal.h   2006-06-16 20:12:26.000000000 +0200
345 +++ libmpeg2/mpeg2_internal.h   2006-06-16 20:12:50.000000000 +0200
346 @@ -144,6 +148,12 @@
347      int second_field;
348  
349      int mpeg1;
350 +
351 +    /* for MPlayer: */
352 +    int quantizer_scales[32];
353 +    int quantizer_scale;
354 +    char* quant_store;
355 +    int quant_stride;
356  };
357  
358  typedef struct {
359 @@ -214,6 +224,10 @@
360      int8_t q_scale_type, scaled[4];
361      uint8_t quantizer_matrix[4][64];
362      uint8_t new_quantizer_matrix[4][64];
363 +
364 +    /* for MPlayer: */
365 +    unsigned char *pending_buffer;
366 +    int pending_length;
367  };
368  
369  typedef struct {
370 --- libmpeg2/slice.c    2006-06-16 20:12:26.000000000 +0200
371 +++ libmpeg2/slice.c    2006-06-16 20:12:50.000000000 +0200
372 @@ -142,6 +146,7 @@
373  
374      quantizer_scale_code = UBITS (bit_buf, 5);
375      DUMPBITS (bit_buf, bits, 5);
376 +    decoder->quantizer_scale = decoder->quantizer_scales[quantizer_scale_code];
377  
378      decoder->quantizer_matrix[0] =
379         decoder->quantizer_prescale[0][quantizer_scale_code];
380 @@ -1564,6 +1569,9 @@
381  
382  #define NEXT_MACROBLOCK                                                        \
383  do {                                                                   \
384 +    if(decoder->quant_store)                                            \
385 +        decoder->quant_store[decoder->quant_stride*(decoder->v_offset>>4) \
386 +                    +(decoder->offset>>4)] = decoder->quantizer_scale;  \
387      decoder->offset += 16;                                             \
388      if (decoder->offset == decoder->width) {                           \
389         do { /* just so we can use the break statement */               \