OSDN Git Service

h264 - Fix PCM intra coded blocks in monochrome case
authorJeff Downs <heydowns@somuchpressure.net>
Tue, 5 Jul 2011 17:20:06 +0000 (13:20 -0400)
committerJeff Downs <heydowns@somuchpressure.net>
Thu, 28 Jul 2011 19:11:16 +0000 (15:11 -0400)
libavcodec/h264.c

index 1f417a8..5771114 100644 (file)
@@ -1809,8 +1809,8 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple, i
     }
 
     if (!simple && IS_INTRA_PCM(mb_type)) {
+        const int bit_depth = h->sps.bit_depth_luma;
         if (pixel_shift) {
-            const int bit_depth = h->sps.bit_depth_luma;
             int j;
             GetBitContext gb;
             init_get_bits(&gb, (uint8_t*)h->mb, 384*bit_depth);
@@ -1821,6 +1821,15 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple, i
                     tmp_y[j] = get_bits(&gb, bit_depth);
             }
             if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
+                if (!h->sps.chroma_format_idc) {
+                    for (i = 0; i < 8; i++) {
+                        uint16_t *tmp_cb = (uint16_t*)(dest_cb + i*uvlinesize);
+                        uint16_t *tmp_cr = (uint16_t*)(dest_cr + i*uvlinesize);
+                        for (j = 0; j < 8; j++) {
+                            tmp_cb[j] = tmp_cr[j] = 1 << (bit_depth - 1);
+                        }
+                    }
+                } else {
                 for (i = 0; i < 8; i++) {
                     uint16_t *tmp_cb = (uint16_t*)(dest_cb + i*uvlinesize);
                     for (j = 0; j < 8; j++)
@@ -1831,16 +1840,24 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple, i
                     for (j = 0; j < 8; j++)
                         tmp_cr[j] = get_bits(&gb, bit_depth);
                 }
+                }
             }
         } else {
             for (i=0; i<16; i++) {
                 memcpy(dest_y + i*  linesize, h->mb       + i*8, 16);
             }
             if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
+                if (!h->sps.chroma_format_idc) {
+                    for (i=0; i<8; i++) {
+                        memset(dest_cb+ i*uvlinesize, 1 << (bit_depth - 1), 8);
+                        memset(dest_cr+ i*uvlinesize, 1 << (bit_depth - 1), 8);
+                    }
+                } else {
                 for (i=0; i<8; i++) {
                     memcpy(dest_cb+ i*uvlinesize, h->mb + 128 + i*4,  8);
                     memcpy(dest_cr+ i*uvlinesize, h->mb + 160 + i*4,  8);
                 }
+                }
             }
         }
     } else {