comparison mjpeg.c @ 786:62faac9a4c3d libavcodec

FOURCC removed, using ff_get_fourcc instead (should be big-endian safe), workarounded a restart interval bug (Spectralfan.mov) (rst support should be rewritten and moved from decode_sos)
author al3x
date Mon, 28 Oct 2002 16:29:40 +0000
parents a48bb8bc63dd
children 972c8ee102d6
comparison
equal deleted inserted replaced
785:18b3fd684767 786:62faac9a4c3d
576 } 576 }
577 577
578 /******************************************/ 578 /******************************************/
579 /* decoding */ 579 /* decoding */
580 580
581 /* compressed picture size */
582 #define PICTURE_BUFFER_SIZE 100000
583
584 #define MAX_COMPONENTS 4 581 #define MAX_COMPONENTS 4
585 582
586 typedef struct MJpegDecodeContext { 583 typedef struct MJpegDecodeContext {
587 AVCodecContext *avctx; 584 AVCodecContext *avctx;
588 GetBitContext gb; 585 GetBitContext gb;
613 DCTELEM block[64] __align8; 610 DCTELEM block[64] __align8;
614 611
615 int buggy_avid; 612 int buggy_avid;
616 int restart_interval; 613 int restart_interval;
617 int restart_count; 614 int restart_count;
618 int interleaved_rows; 615 int interlace_polarity;
619 ScanTable scantable; 616 ScanTable scantable;
620 void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); 617 void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
621 } MJpegDecodeContext; 618 } MJpegDecodeContext;
622 619
623 static int mjpeg_decode_dht(MJpegDecodeContext *s); 620 static int mjpeg_decode_dht(MJpegDecodeContext *s);
653 s->scantable= s2.intra_scantable; 650 s->scantable= s2.intra_scantable;
654 s->idct_put= s2.idct_put; 651 s->idct_put= s2.idct_put;
655 MPV_common_end(&s2); 652 MPV_common_end(&s2);
656 653
657 s->mpeg_enc_ctx_allocated = 0; 654 s->mpeg_enc_ctx_allocated = 0;
658 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into 655 s->buffer_size = 102400; /* smaller buffer should be enough,
659 account FF 00 case */ 656 but photojpg files could ahive bigger sizes */
660 s->buffer = av_malloc(s->buffer_size); 657 s->buffer = av_malloc(s->buffer_size);
661 s->start_code = -1; 658 s->start_code = -1;
662 s->first_picture = 1; 659 s->first_picture = 1;
663 s->org_width = avctx->width; 660 s->org_width = avctx->width;
664 s->org_height = avctx->height; 661 s->org_height = avctx->height;
800 /* test interlaced mode */ 797 /* test interlaced mode */
801 if (s->first_picture && 798 if (s->first_picture &&
802 s->org_height != 0 && 799 s->org_height != 0 &&
803 s->height < ((s->org_height * 3) / 4)) { 800 s->height < ((s->org_height * 3) / 4)) {
804 s->interlaced = 1; 801 s->interlaced = 1;
802 // s->bottom_field = (s->interlace_polarity) ? 1 : 0;
805 s->bottom_field = 0; 803 s->bottom_field = 0;
806 } 804 }
807 805
808 for(i=0;i<nb_components;i++) { 806 for(i=0;i<nb_components;i++) {
809 int w, h; 807 int w, h;
1032 x = 0; 1030 x = 0;
1033 y++; 1031 y++;
1034 } 1032 }
1035 } 1033 }
1036 } 1034 }
1037 if (s->restart_interval && !--s->restart_count) { 1035 if ((s->restart_interval <= 8) && !--s->restart_count) {
1038 align_get_bits(&s->gb); 1036 align_get_bits(&s->gb);
1039 skip_bits(&s->gb, 16); /* skip RSTn */ 1037 skip_bits(&s->gb, 16); /* skip RSTn */
1040 for (j=0; j<nb_components; j++) /* reset dc */ 1038 for (j=0; j<nb_components; j++) /* reset dc */
1041 s->last_dc[j] = 1024; 1039 s->last_dc[j] = 1024;
1042 } 1040 }
1059 dprintf("restart interval: %d\n", s->restart_interval); 1057 dprintf("restart interval: %d\n", s->restart_interval);
1060 1058
1061 return 0; 1059 return 0;
1062 } 1060 }
1063 1061
1064 #define FOURCC(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | d) 1062 static int mjpeg_decode_app(MJpegDecodeContext *s)
1065 static int mjpeg_decode_app(MJpegDecodeContext *s, int start_code)
1066 { 1063 {
1067 int len, id; 1064 int len, id;
1068 1065
1069 /* XXX: verify len field validity */ 1066 /* XXX: verify len field validity */
1070 len = get_bits(&s->gb, 16); 1067 len = get_bits(&s->gb, 16);
1071 if (len < 5) 1068 if (len < 5)
1072 return -1; 1069 return -1;
1073 1070
1074 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16); 1071 id = be2me_32((get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16));
1075 len -= 6; 1072 len -= 6;
1076 1073
1077 /* buggy AVID, it puts EOI only at every 10th frame */ 1074 /* buggy AVID, it puts EOI only at every 10th frame */
1078 /* also this fourcc is used by non-avid files too, it means 1075 /* also this fourcc is used by non-avid files too, it means
1079 interleaving, but it's always present in AVID files */ 1076 interleaving, but it's always present in AVID files */
1080 if (id == FOURCC('A','V','I','1')) 1077 if (id == ff_get_fourcc("AVI1"))
1081 { 1078 {
1082 /* structure: 1079 /* structure:
1083 4bytes AVI1 1080 4bytes AVI1
1084 1bytes polarity 1081 1bytes polarity
1085 1bytes always zero 1082 1bytes always zero
1086 4bytes field_size 1083 4bytes field_size
1087 4bytes field_size_less_padding 1084 4bytes field_size_less_padding
1088 */ 1085 */
1089 s->buggy_avid = 1; 1086 s->buggy_avid = 1;
1090 if (s->first_picture) 1087 // if (s->first_picture)
1091 printf("mjpeg: workarounding buggy AVID\n"); 1088 // printf("mjpeg: workarounding buggy AVID\n");
1092 s->interleaved_rows = get_bits(&s->gb, 8); 1089 s->interlace_polarity = get_bits(&s->gb, 8);
1093 #if 0 1090 #if 0
1094 skip_bits(&s->gb, 8); 1091 skip_bits(&s->gb, 8);
1095 skip_bits(&s->gb, 32); 1092 skip_bits(&s->gb, 32);
1096 skip_bits(&s->gb, 32); 1093 skip_bits(&s->gb, 32);
1097 len -= 10; 1094 len -= 10;
1098 #endif 1095 #endif
1099 if (s->interleaved_rows) 1096 // if (s->interlace_polarity)
1100 printf("mjpeg: interleaved rows: %d\n", s->interleaved_rows); 1097 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1101 goto out; 1098 goto out;
1102 } 1099 }
1103 1100
1104 len -= 2; 1101 len -= 2;
1105 1102
1106 if (id == FOURCC('J','F','I','F')) 1103 if (id == ff_get_fourcc("JFIF"))
1107 { 1104 {
1108 skip_bits(&s->gb, 8); /* the trailing zero-byte */ 1105 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1109 printf("mjpeg: JFIF header found (version: %x.%x)\n", 1106 printf("mjpeg: JFIF header found (version: %x.%x)\n",
1110 get_bits(&s->gb, 8), get_bits(&s->gb, 8)); 1107 get_bits(&s->gb, 8), get_bits(&s->gb, 8));
1111 if (get_bits(&s->gb, 8) == 0) 1108 if (get_bits(&s->gb, 8) == 0)
1123 skip_bits(&s->gb, 8); 1120 skip_bits(&s->gb, 8);
1124 goto out; 1121 goto out;
1125 } 1122 }
1126 1123
1127 /* Apple MJPEG-A */ 1124 /* Apple MJPEG-A */
1128 if ((start_code == APP1) && (len > (0x28 - 8))) 1125 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1129 { 1126 {
1130 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16); 1127 id = be2me_32((get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16));
1131 len -= 4; 1128 len -= 4;
1132 if (id == FOURCC('m','j','p','g')) /* Apple MJPEG-A */ 1129 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1133 { 1130 {
1134 #if 0 1131 #if 0
1135 skip_bits(&s->gb, 32); /* field size */ 1132 skip_bits(&s->gb, 32); /* field size */
1136 skip_bits(&s->gb, 32); /* pad field size */ 1133 skip_bits(&s->gb, 32); /* pad field size */
1137 skip_bits(&s->gb, 32); /* next off */ 1134 skip_bits(&s->gb, 32); /* next off */
1145 printf("mjpeg: Apple MJPEG-A header found\n"); 1142 printf("mjpeg: Apple MJPEG-A header found\n");
1146 } 1143 }
1147 } 1144 }
1148 1145
1149 out: 1146 out:
1150 /* should check for further values.. */
1151
1152 return 0; 1147 return 0;
1153 } 1148 }
1154 #undef FOURCC
1155 1149
1156 static int mjpeg_decode_com(MJpegDecodeContext *s) 1150 static int mjpeg_decode_com(MJpegDecodeContext *s)
1157 { 1151 {
1158 int len, i; 1152 int len, i;
1159 UINT8 *cbuf; 1153 UINT8 *cbuf;
1269 if ((buf_end - buf_ptr) > s->buffer_size) 1263 if ((buf_end - buf_ptr) > s->buffer_size)
1270 { 1264 {
1271 av_free(s->buffer); 1265 av_free(s->buffer);
1272 s->buffer_size = buf_end-buf_ptr; 1266 s->buffer_size = buf_end-buf_ptr;
1273 s->buffer = av_malloc(s->buffer_size); 1267 s->buffer = av_malloc(s->buffer_size);
1268 dprintf("buffer too small, expanding to %d bytes\n",
1269 s->buffer_size);
1274 } 1270 }
1275 1271
1276 /* unescape buffer of SOS */ 1272 /* unescape buffer of SOS */
1277 if (start_code == SOS) 1273 if (start_code == SOS)
1278 { 1274 {
1304 if (start_code >= 0xd0 && start_code <= 0xd7) { 1300 if (start_code >= 0xd0 && start_code <= 0xd7) {
1305 dprintf("restart marker: %d\n", start_code&0x0f); 1301 dprintf("restart marker: %d\n", start_code&0x0f);
1306 } else if (s->first_picture) { 1302 } else if (s->first_picture) {
1307 /* APP fields */ 1303 /* APP fields */
1308 if (start_code >= 0xe0 && start_code <= 0xef) 1304 if (start_code >= 0xe0 && start_code <= 0xef)
1309 mjpeg_decode_app(s, start_code); 1305 mjpeg_decode_app(s);
1310 /* Comment */ 1306 /* Comment */
1311 else if (start_code == COM) 1307 else if (start_code == COM)
1312 mjpeg_decode_com(s); 1308 mjpeg_decode_com(s);
1313 } 1309 }
1314 1310