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)