Commit db431f7e authored by Ronald S. Bultje's avatar Ronald S. Bultje

h264: add support for decoding planar RGB images.

parent 6b0768e2
...@@ -2727,24 +2727,33 @@ static int decode_slice_header(H264Context *h, H264Context *h0){ ...@@ -2727,24 +2727,33 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
switch (h->sps.bit_depth_luma) { switch (h->sps.bit_depth_luma) {
case 9 : case 9 :
if (CHROMA444) if (CHROMA444) {
s->avctx->pix_fmt = PIX_FMT_YUV444P9; if (s->avctx->colorspace == AVCOL_SPC_RGB) {
else if (CHROMA422) s->avctx->pix_fmt = PIX_FMT_GBRP9;
} else
s->avctx->pix_fmt = PIX_FMT_YUV444P9;
} else if (CHROMA422)
s->avctx->pix_fmt = PIX_FMT_YUV422P9; s->avctx->pix_fmt = PIX_FMT_YUV422P9;
else else
s->avctx->pix_fmt = PIX_FMT_YUV420P9; s->avctx->pix_fmt = PIX_FMT_YUV420P9;
break; break;
case 10 : case 10 :
if (CHROMA444) if (CHROMA444) {
s->avctx->pix_fmt = PIX_FMT_YUV444P10; if (s->avctx->colorspace == AVCOL_SPC_RGB) {
else if (CHROMA422) s->avctx->pix_fmt = PIX_FMT_GBRP10;
} else
s->avctx->pix_fmt = PIX_FMT_YUV444P10;
} else if (CHROMA422)
s->avctx->pix_fmt = PIX_FMT_YUV422P10; s->avctx->pix_fmt = PIX_FMT_YUV422P10;
else else
s->avctx->pix_fmt = PIX_FMT_YUV420P10; s->avctx->pix_fmt = PIX_FMT_YUV420P10;
break; break;
default: default:
if (CHROMA444){ if (CHROMA444){
s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ444P : PIX_FMT_YUV444P; if (s->avctx->colorspace == AVCOL_SPC_RGB) {
s->avctx->pix_fmt = PIX_FMT_GBRP;
} else
s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ444P : PIX_FMT_YUV444P;
} else if (CHROMA422) { } else if (CHROMA422) {
s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ422P : PIX_FMT_YUV422P; s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ422P : PIX_FMT_YUV422P;
}else{ }else{
......
...@@ -138,6 +138,7 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int l ...@@ -138,6 +138,7 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int l
case PIX_FMT_YUV422P: case PIX_FMT_YUV422P:
case PIX_FMT_YUV440P: case PIX_FMT_YUV440P:
case PIX_FMT_YUV444P: case PIX_FMT_YUV444P:
case PIX_FMT_GBRP:
case PIX_FMT_GRAY8: case PIX_FMT_GRAY8:
case PIX_FMT_GRAY16BE: case PIX_FMT_GRAY16BE:
case PIX_FMT_GRAY16LE: case PIX_FMT_GRAY16LE:
...@@ -158,6 +159,10 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int l ...@@ -158,6 +159,10 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int l
case PIX_FMT_YUV444P9BE: case PIX_FMT_YUV444P9BE:
case PIX_FMT_YUV444P10LE: case PIX_FMT_YUV444P10LE:
case PIX_FMT_YUV444P10BE: case PIX_FMT_YUV444P10BE:
case PIX_FMT_GBRP9LE:
case PIX_FMT_GBRP9BE:
case PIX_FMT_GBRP10LE:
case PIX_FMT_GBRP10BE:
w_align= 16; //FIXME check for non mpeg style codecs and use less alignment w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
h_align= 16; h_align= 16;
if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP || s->codec_id == CODEC_ID_H264) if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP || s->codec_id == CODEC_ID_H264)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment