Mercurial > libavcodec.hg
comparison mjpeg.c @ 3929:a31f865dd68d libavcodec
mjpeg 4:2:2 encoding support
author | bcoudurier |
---|---|
date | Wed, 04 Oct 2006 12:49:52 +0000 |
parents | 1843a85123b7 |
children | c8c591fe26f8 |
comparison
equal
deleted
inserted
replaced
3928:987fffdf6ae7 | 3929:a31f865dd68d |
---|---|
611 MJpegContext *m = s->mjpeg_ctx; | 611 MJpegContext *m = s->mjpeg_ctx; |
612 uint8_t *huff_size_ac; | 612 uint8_t *huff_size_ac; |
613 uint16_t *huff_code_ac; | 613 uint16_t *huff_code_ac; |
614 | 614 |
615 /* DC coef */ | 615 /* DC coef */ |
616 component = (n <= 3 ? 0 : n - 4 + 1); | 616 component = (n <= 3 ? 0 : (n&1) + 1); |
617 dc = block[0]; /* overflow is impossible */ | 617 dc = block[0]; /* overflow is impossible */ |
618 val = dc - s->last_dc[component]; | 618 val = dc - s->last_dc[component]; |
619 if (n < 4) { | 619 if (n < 4) { |
620 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance); | 620 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance); |
621 huff_size_ac = m->huff_size_ac_luminance; | 621 huff_size_ac = m->huff_size_ac_luminance; |
664 | 664 |
665 void mjpeg_encode_mb(MpegEncContext *s, | 665 void mjpeg_encode_mb(MpegEncContext *s, |
666 DCTELEM block[6][64]) | 666 DCTELEM block[6][64]) |
667 { | 667 { |
668 int i; | 668 int i; |
669 for(i=0;i<6;i++) { | 669 for(i=0;i<5;i++) { |
670 encode_block(s, block[i], i); | 670 encode_block(s, block[i], i); |
671 } | |
672 if (s->chroma_format == CHROMA_420) { | |
673 encode_block(s, block[5], 5); | |
674 } else { | |
675 encode_block(s, block[6], 6); | |
676 encode_block(s, block[5], 5); | |
677 encode_block(s, block[7], 7); | |
671 } | 678 } |
672 } | 679 } |
673 | 680 |
674 static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | 681 static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ |
675 MpegEncContext * const s = avctx->priv_data; | 682 MpegEncContext * const s = avctx->priv_data; |
1101 return 0; | 1108 return 0; |
1102 } | 1109 } |
1103 | 1110 |
1104 static int mjpeg_decode_sof(MJpegDecodeContext *s) | 1111 static int mjpeg_decode_sof(MJpegDecodeContext *s) |
1105 { | 1112 { |
1106 int len, nb_components, i, width, height; | 1113 int len, nb_components, i, width, height, pix_fmt_id; |
1107 | 1114 |
1108 /* XXX: verify len field validity */ | 1115 /* XXX: verify len field validity */ |
1109 len = get_bits(&s->gb, 16); | 1116 len = get_bits(&s->gb, 16); |
1110 s->bits= get_bits(&s->gb, 8); | 1117 s->bits= get_bits(&s->gb, 8); |
1111 | 1118 |
1186 | 1193 |
1187 if(s->interlaced && s->bottom_field) | 1194 if(s->interlaced && s->bottom_field) |
1188 return 0; | 1195 return 0; |
1189 | 1196 |
1190 /* XXX: not complete test ! */ | 1197 /* XXX: not complete test ! */ |
1191 switch((s->h_count[0] << 4) | s->v_count[0]) { | 1198 pix_fmt_id = (s->h_count[0] << 20) | (s->v_count[0] << 16) | |
1192 case 0x11: | 1199 (s->h_count[1] << 12) | (s->v_count[1] << 8) | |
1200 (s->h_count[2] << 4) | s->v_count[2]; | |
1201 dprintf("pix fmt id %x\n", pix_fmt_id); | |
1202 switch(pix_fmt_id){ | |
1203 case 0x222222: | |
1204 case 0x111111: | |
1193 if(s->rgb){ | 1205 if(s->rgb){ |
1194 s->avctx->pix_fmt = PIX_FMT_RGBA32; | 1206 s->avctx->pix_fmt = PIX_FMT_RGBA32; |
1195 }else if(s->nb_components==3) | 1207 }else if(s->nb_components==3) |
1196 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV444P : PIX_FMT_YUVJ444P; | 1208 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV444P : PIX_FMT_YUVJ444P; |
1197 else | 1209 else |
1198 s->avctx->pix_fmt = PIX_FMT_GRAY8; | 1210 s->avctx->pix_fmt = PIX_FMT_GRAY8; |
1199 break; | 1211 break; |
1200 case 0x21: | 1212 case 0x211111: |
1213 case 0x221212: | |
1201 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P; | 1214 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P; |
1202 break; | 1215 break; |
1203 default: | 1216 default: |
1204 case 0x22: | 1217 case 0x221111: |
1205 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P; | 1218 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P; |
1206 break; | 1219 break; |
1207 } | 1220 } |
1208 if(s->ls){ | 1221 if(s->ls){ |
1209 if(s->nb_components > 1) | 1222 if(s->nb_components > 1) |