diff options
author | Jeff Downs <heydowns@somuchpressure.net> | 2011-07-05 13:20:06 -0400 |
---|---|---|
committer | Jeff Downs <heydowns@somuchpressure.net> | 2011-07-28 15:11:16 -0400 |
commit | 188694b2f50b125b31cf5d287751ee85af937c2b (patch) | |
tree | 3d72eaa47d04e1ca7bf7faeee50887dbdbd18fc1 | |
parent | 956c901c68eff78288f40e3c8f41ee2fa081d4a8 (diff) | |
download | ffmpeg-188694b2f50b125b31cf5d287751ee85af937c2b.tar.gz |
h264 - Fix PCM intra coded blocks in monochrome case
-rw-r--r-- | libavcodec/h264.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 1f417a860a..57711141ae 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -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 { |