changeset 29452:e8d71beb79b9

Fix H.264 SPS parsing in case of scaling list present. Patch by Marco Munderloh, munderl A tnt D uni-hannover D de
author cehoyos
date Tue, 11 Aug 2009 18:44:43 +0000
parents 6aca83f5ba73
children 3a154fb8f85c
files libmpdemux/mpeg_hdr.c
diffstat 1 files changed, 15 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/mpeg_hdr.c	Tue Aug 11 18:28:26 2009 +0000
+++ b/libmpdemux/mpeg_hdr.c	Tue Aug 11 18:44:43 2009 +0000
@@ -303,6 +303,11 @@
   return v2;
 }
 
+inline static int read_golomb_s(unsigned char *buffer, unsigned int *init)
+{
+  unsigned int v = read_golomb(buffer, init);
+  return (v & 1) ? ((v + 1) >> 1) : -(v >> 1);
+}
 
 static int h264_parse_vui(mp_mpeg_header_t * picture, unsigned char * buf, unsigned int n)
 {
@@ -361,7 +366,7 @@
 
 int h264_parse_sps(mp_mpeg_header_t * picture, unsigned char * buf, int len)
 {
-  unsigned int n = 0, v, i, mbh;
+  unsigned int n = 0, v, i, k, mbh;
   int frame_mbs_only;
 
   len = mp_unescape03(buf, len);
@@ -376,7 +381,15 @@
     read_golomb(buf, &n);
     n++;
     if(getbits(buf, n++, 1)){
-      //FIXME scaling matrix
+      for(i = 0; i < 8; i++)
+      {  // scaling list is skipped for now
+        if(getbits(buf, n++, 1))
+        {
+          v = 8;
+          for(k = (i < 6 ? 16 : 64); k && v; k--)
+            v = (v + read_golomb_s(buf, &n)) & 255;
+        }
+      }
     }
   }
   read_golomb(buf, &n);