Mercurial > libavcodec.hg
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 |