h264: add support for decoding planar RGB images.
This commit is contained in:
		@@ -2727,23 +2727,32 @@ 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) {
 | 
				
			||||||
 | 
					                    if (s->avctx->colorspace == AVCOL_SPC_RGB) {
 | 
				
			||||||
 | 
					                        s->avctx->pix_fmt = PIX_FMT_GBRP9;
 | 
				
			||||||
 | 
					                    } else
 | 
				
			||||||
                        s->avctx->pix_fmt = PIX_FMT_YUV444P9;
 | 
					                        s->avctx->pix_fmt = PIX_FMT_YUV444P9;
 | 
				
			||||||
                else if (CHROMA422)
 | 
					                } 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) {
 | 
				
			||||||
 | 
					                    if (s->avctx->colorspace == AVCOL_SPC_RGB) {
 | 
				
			||||||
 | 
					                        s->avctx->pix_fmt = PIX_FMT_GBRP10;
 | 
				
			||||||
 | 
					                    } else
 | 
				
			||||||
                        s->avctx->pix_fmt = PIX_FMT_YUV444P10;
 | 
					                        s->avctx->pix_fmt = PIX_FMT_YUV444P10;
 | 
				
			||||||
                else if (CHROMA422)
 | 
					                } 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){
 | 
				
			||||||
 | 
					                    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;
 | 
					                        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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			|||||||
    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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user