From: Carl Eugen Hoyos Date: Thu, 9 Feb 2012 22:26:28 +0000 (+0100) Subject: Support encoding BGR24 and BGR0 in ljpeg. X-Git-Tag: android-x86-4.4-r1~13463 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=52719dae8a45cec2eb2851b1c14da978e8885e94;p=android-x86%2Fexternal-ffmpeg.git Support encoding BGR24 and BGR0 in ljpeg. --- diff --git a/libavcodec/ljpegenc.c b/libavcodec/ljpegenc.c index f8178d5adb..4d81b5fc90 100644 --- a/libavcodec/ljpegenc.c +++ b/libavcodec/ljpegenc.c @@ -56,7 +56,9 @@ static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, in s->header_bits= put_bits_count(&s->pb); - if(avctx->pix_fmt == PIX_FMT_BGRA){ + if(avctx->pix_fmt == PIX_FMT_BGR0 + || avctx->pix_fmt == PIX_FMT_BGRA + || avctx->pix_fmt == PIX_FMT_BGR24){ int x, y, i; const int linesize= p->linesize[0]; uint16_t (*buffer)[4]= (void *) s->rd_scratchpad; @@ -79,9 +81,15 @@ static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, in top[i]= left[i]= topleft[i]= buffer[0][i]; } for(x = 0; x < width; x++) { + if(avctx->pix_fmt == PIX_FMT_BGR24){ + buffer[x][1] = ptr[3*x+0] - ptr[3*x+1] + 0x100; + buffer[x][2] = ptr[3*x+2] - ptr[3*x+1] + 0x100; + buffer[x][0] = (ptr[3*x+0] + 2*ptr[3*x+1] + ptr[3*x+2])>>2; + }else{ buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100; buffer[x][2] = ptr[4*x+2] - ptr[4*x+1] + 0x100; buffer[x][0] = (ptr[4*x+0] + 2*ptr[4*x+1] + ptr[4*x+2])>>2; + } for(i=0;i<3;i++) { int pred, diff; diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index 4e77e0d659..bddcc0d041 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -214,7 +214,9 @@ void ff_mjpeg_encode_picture_header(MpegEncContext *s) } put_bits(&s->pb, 16, 17); - if(lossless && s->avctx->pix_fmt == PIX_FMT_BGRA) + if(lossless && (s->avctx->pix_fmt == PIX_FMT_BGR0 + || s->avctx->pix_fmt == PIX_FMT_BGRA + || s->avctx->pix_fmt == PIX_FMT_BGR24)) put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */ else put_bits(&s->pb, 8, 8); /* 8 bits/component */ diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 4eaad5d819..a3ec5c18a1 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -295,7 +295,9 @@ av_cold int MPV_encode_init(AVCodecContext *avctx) if (avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P && avctx->pix_fmt != PIX_FMT_YUVJ444P && + avctx->pix_fmt != PIX_FMT_BGR0 && avctx->pix_fmt != PIX_FMT_BGRA && + avctx->pix_fmt != PIX_FMT_BGR24 && ((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P && avctx->pix_fmt != PIX_FMT_YUV444P) || @@ -625,7 +627,10 @@ av_cold int MPV_encode_init(AVCodecContext *avctx) case CODEC_ID_AMV: s->out_format = FMT_MJPEG; s->intra_only = 1; /* force intra only for jpeg */ - if (avctx->codec->id == CODEC_ID_LJPEG && avctx->pix_fmt == PIX_FMT_BGRA) { + if (avctx->codec->id == CODEC_ID_LJPEG && + (avctx->pix_fmt == PIX_FMT_BGR0 + || s->avctx->pix_fmt == PIX_FMT_BGRA + || s->avctx->pix_fmt == PIX_FMT_BGR24)) { s->mjpeg_vsample[0] = s->mjpeg_hsample[0] = s->mjpeg_vsample[1] = s->mjpeg_hsample[1] = s->mjpeg_vsample[2] = s->mjpeg_hsample[2] = 1;