mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-03 06:27:44 +08:00
mjpeg 4:2:2 encoding support
Originally committed as revision 6550 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -613,7 +613,7 @@ static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
|
|||||||
uint16_t *huff_code_ac;
|
uint16_t *huff_code_ac;
|
||||||
|
|
||||||
/* DC coef */
|
/* DC coef */
|
||||||
component = (n <= 3 ? 0 : n - 4 + 1);
|
component = (n <= 3 ? 0 : (n&1) + 1);
|
||||||
dc = block[0]; /* overflow is impossible */
|
dc = block[0]; /* overflow is impossible */
|
||||||
val = dc - s->last_dc[component];
|
val = dc - s->last_dc[component];
|
||||||
if (n < 4) {
|
if (n < 4) {
|
||||||
@ -666,9 +666,16 @@ void mjpeg_encode_mb(MpegEncContext *s,
|
|||||||
DCTELEM block[6][64])
|
DCTELEM block[6][64])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for(i=0;i<6;i++) {
|
for(i=0;i<5;i++) {
|
||||||
encode_block(s, block[i], i);
|
encode_block(s, block[i], i);
|
||||||
}
|
}
|
||||||
|
if (s->chroma_format == CHROMA_420) {
|
||||||
|
encode_block(s, block[5], 5);
|
||||||
|
} else {
|
||||||
|
encode_block(s, block[6], 6);
|
||||||
|
encode_block(s, block[5], 5);
|
||||||
|
encode_block(s, block[7], 7);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
|
static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
|
||||||
@ -1103,7 +1110,7 @@ static int mjpeg_decode_dht(MJpegDecodeContext *s)
|
|||||||
|
|
||||||
static int mjpeg_decode_sof(MJpegDecodeContext *s)
|
static int mjpeg_decode_sof(MJpegDecodeContext *s)
|
||||||
{
|
{
|
||||||
int len, nb_components, i, width, height;
|
int len, nb_components, i, width, height, pix_fmt_id;
|
||||||
|
|
||||||
/* XXX: verify len field validity */
|
/* XXX: verify len field validity */
|
||||||
len = get_bits(&s->gb, 16);
|
len = get_bits(&s->gb, 16);
|
||||||
@ -1188,8 +1195,13 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* XXX: not complete test ! */
|
/* XXX: not complete test ! */
|
||||||
switch((s->h_count[0] << 4) | s->v_count[0]) {
|
pix_fmt_id = (s->h_count[0] << 20) | (s->v_count[0] << 16) |
|
||||||
case 0x11:
|
(s->h_count[1] << 12) | (s->v_count[1] << 8) |
|
||||||
|
(s->h_count[2] << 4) | s->v_count[2];
|
||||||
|
dprintf("pix fmt id %x\n", pix_fmt_id);
|
||||||
|
switch(pix_fmt_id){
|
||||||
|
case 0x222222:
|
||||||
|
case 0x111111:
|
||||||
if(s->rgb){
|
if(s->rgb){
|
||||||
s->avctx->pix_fmt = PIX_FMT_RGBA32;
|
s->avctx->pix_fmt = PIX_FMT_RGBA32;
|
||||||
}else if(s->nb_components==3)
|
}else if(s->nb_components==3)
|
||||||
@ -1197,11 +1209,12 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s)
|
|||||||
else
|
else
|
||||||
s->avctx->pix_fmt = PIX_FMT_GRAY8;
|
s->avctx->pix_fmt = PIX_FMT_GRAY8;
|
||||||
break;
|
break;
|
||||||
case 0x21:
|
case 0x211111:
|
||||||
|
case 0x221212:
|
||||||
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P;
|
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case 0x22:
|
case 0x221111:
|
||||||
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P;
|
s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -940,7 +940,8 @@ int MPV_encode_init(AVCodecContext *avctx)
|
|||||||
break;
|
break;
|
||||||
case CODEC_ID_LJPEG:
|
case CODEC_ID_LJPEG:
|
||||||
case CODEC_ID_MJPEG:
|
case CODEC_ID_MJPEG:
|
||||||
if(avctx->pix_fmt != PIX_FMT_YUVJ420P && (avctx->pix_fmt != PIX_FMT_YUV420P || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
|
if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P &&
|
||||||
|
((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P) || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
|
||||||
av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
|
av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1182,12 +1183,12 @@ int MPV_encode_init(AVCodecContext *avctx)
|
|||||||
s->intra_only = 1; /* force intra only for jpeg */
|
s->intra_only = 1; /* force intra only for jpeg */
|
||||||
s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;
|
s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;
|
||||||
s->mjpeg_data_only_frames = 0; /* write all the needed headers */
|
s->mjpeg_data_only_frames = 0; /* write all the needed headers */
|
||||||
s->mjpeg_vsample[0] = 1<<chroma_v_shift;
|
s->mjpeg_vsample[0] = 2;
|
||||||
s->mjpeg_vsample[1] = 1;
|
s->mjpeg_vsample[1] = 2>>chroma_v_shift;
|
||||||
s->mjpeg_vsample[2] = 1;
|
s->mjpeg_vsample[2] = 2>>chroma_v_shift;
|
||||||
s->mjpeg_hsample[0] = 1<<chroma_h_shift;
|
s->mjpeg_hsample[0] = 2;
|
||||||
s->mjpeg_hsample[1] = 1;
|
s->mjpeg_hsample[1] = 2>>chroma_h_shift;
|
||||||
s->mjpeg_hsample[2] = 1;
|
s->mjpeg_hsample[2] = 2>>chroma_h_shift;
|
||||||
if (mjpeg_init(s) < 0)
|
if (mjpeg_init(s) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
avctx->delay=0;
|
avctx->delay=0;
|
||||||
@ -6842,7 +6843,7 @@ AVCodec mjpeg_encoder = {
|
|||||||
MPV_encode_init,
|
MPV_encode_init,
|
||||||
MPV_encode_picture,
|
MPV_encode_picture,
|
||||||
MPV_encode_end,
|
MPV_encode_end,
|
||||||
.pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, -1},
|
.pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, -1},
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //CONFIG_ENCODERS
|
#endif //CONFIG_ENCODERS
|
||||||
|
Reference in New Issue
Block a user