Mercurial > libavcodec.hg
comparison mjpeg.c @ 2970:583b6ac45c07 libavcodec
unfinished jpeg-ls codec (feel free to finish it ...)
author | michael |
---|---|
date | Sun, 18 Dec 2005 13:17:44 +0000 |
parents | ef2149182f1c |
children | b5e8b6821274 |
comparison
equal
deleted
inserted
replaced
2969:c9f6a0946672 | 2970:583b6ac45c07 |
---|---|
116 JPG2 = 0xf2, | 116 JPG2 = 0xf2, |
117 JPG3 = 0xf3, | 117 JPG3 = 0xf3, |
118 JPG4 = 0xf4, | 118 JPG4 = 0xf4, |
119 JPG5 = 0xf5, | 119 JPG5 = 0xf5, |
120 JPG6 = 0xf6, | 120 JPG6 = 0xf6, |
121 JPG7 = 0xf7, | 121 SOF48 = 0xf7, ///< JPEG-LS |
122 JPG8 = 0xf8, | 122 LSE = 0xf8, ///< JPEG-LS extension parameters |
123 JPG9 = 0xf9, | 123 JPG9 = 0xf9, |
124 JPG10 = 0xfa, | 124 JPG10 = 0xfa, |
125 JPG11 = 0xfb, | 125 JPG11 = 0xfb, |
126 JPG12 = 0xfc, | 126 JPG12 = 0xfc, |
127 JPG13 = 0xfd, | 127 JPG13 = 0xfd, |
415 } | 415 } |
416 } | 416 } |
417 | 417 |
418 void mjpeg_picture_header(MpegEncContext *s) | 418 void mjpeg_picture_header(MpegEncContext *s) |
419 { | 419 { |
420 const int lossless= s->avctx->codec_id == CODEC_ID_LJPEG; | 420 const int lossless= s->avctx->codec_id != CODEC_ID_MJPEG; |
421 const int ls = s->avctx->codec_id == CODEC_ID_JPEGLS; | |
422 | |
423 assert(!(ls && s->mjpeg_write_tables)); | |
421 | 424 |
422 put_marker(&s->pb, SOI); | 425 put_marker(&s->pb, SOI); |
423 | 426 |
424 if (!s->mjpeg_data_only_frames) | 427 if (!s->mjpeg_data_only_frames) |
425 { | 428 { |
426 jpeg_put_comments(s); | 429 jpeg_put_comments(s); |
427 | 430 |
428 if (s->mjpeg_write_tables) jpeg_table_header(s); | 431 if (s->mjpeg_write_tables) jpeg_table_header(s); |
429 | 432 |
430 put_marker(&s->pb, lossless ? SOF3 : SOF0); | 433 switch(s->avctx->codec_id){ |
434 case CODEC_ID_MJPEG: put_marker(&s->pb, SOF0 ); break; | |
435 case CODEC_ID_LJPEG: put_marker(&s->pb, SOF3 ); break; | |
436 case CODEC_ID_JPEGLS: put_marker(&s->pb, SOF48); break; | |
437 default: assert(0); | |
438 } | |
431 | 439 |
432 put_bits(&s->pb, 16, 17); | 440 put_bits(&s->pb, 16, 17); |
433 if(lossless && s->avctx->pix_fmt == PIX_FMT_RGBA32) | 441 if(lossless && s->avctx->pix_fmt == PIX_FMT_RGBA32) |
434 put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */ | 442 put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */ |
435 else | 443 else |
483 /* Cr component */ | 491 /* Cr component */ |
484 put_bits(&s->pb, 8, 3); /* index */ | 492 put_bits(&s->pb, 8, 3); /* index */ |
485 put_bits(&s->pb, 4, 1); /* DC huffman table index */ | 493 put_bits(&s->pb, 4, 1); /* DC huffman table index */ |
486 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */ | 494 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */ |
487 | 495 |
488 put_bits(&s->pb, 8, lossless ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */ | 496 put_bits(&s->pb, 8, (lossless && !ls) ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */ |
489 put_bits(&s->pb, 8, lossless ? 0 : 63); /* Se (not used) */ | 497 |
498 switch(s->avctx->codec_id){ | |
499 case CODEC_ID_MJPEG: put_bits(&s->pb, 8, 63); break; /* Se (not used) */ | |
500 case CODEC_ID_LJPEG: put_bits(&s->pb, 8, 0); break; /* not used */ | |
501 case CODEC_ID_JPEGLS: put_bits(&s->pb, 8, 1); break; /* ILV = line interleaved */ | |
502 default: assert(0); | |
503 } | |
504 | |
490 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */ | 505 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */ |
506 | |
507 //FIXME DC/AC entropy table selectors stuff in jpegls | |
491 } | 508 } |
492 | 509 |
493 static void escape_FF(MpegEncContext *s, int start) | 510 static void escape_FF(MpegEncContext *s, int start) |
494 { | 511 { |
495 int size= put_bits_count(&s->pb) - start*8; | 512 int size= put_bits_count(&s->pb) - start*8; |
825 int org_height; /* size given at codec init */ | 842 int org_height; /* size given at codec init */ |
826 int first_picture; /* true if decoding first picture */ | 843 int first_picture; /* true if decoding first picture */ |
827 int interlaced; /* true if interlaced */ | 844 int interlaced; /* true if interlaced */ |
828 int bottom_field; /* true if bottom field */ | 845 int bottom_field; /* true if bottom field */ |
829 int lossless; | 846 int lossless; |
847 int ls; | |
830 int rgb; | 848 int rgb; |
831 int rct; /* standard rct */ | 849 int rct; /* standard rct */ |
832 int pegasus_rct; /* pegasus reversible colorspace transform */ | 850 int pegasus_rct; /* pegasus reversible colorspace transform */ |
833 int bits; /* bits per component */ | 851 int bits; /* bits per component */ |
852 | |
853 int maxval; | |
854 int near; ///< near lossless bound (si 0 for lossless) | |
855 int t1,t2,t3; | |
856 int reset; ///< context halfing intervall ?rename | |
834 | 857 |
835 int width, height; | 858 int width, height; |
836 int mb_width, mb_height; | 859 int mb_width, mb_height; |
837 int nb_components; | 860 int nb_components; |
838 int component_id[MAX_COMPONENTS]; | 861 int component_id[MAX_COMPONENTS]; |
861 int cs_itu601; | 884 int cs_itu601; |
862 int interlace_polarity; | 885 int interlace_polarity; |
863 | 886 |
864 int mjpb_skiptosod; | 887 int mjpb_skiptosod; |
865 } MJpegDecodeContext; | 888 } MJpegDecodeContext; |
889 | |
890 #include "jpeg_ls.c" //FIXME make jpeg-ls more independant | |
866 | 891 |
867 static int mjpeg_decode_dht(MJpegDecodeContext *s); | 892 static int mjpeg_decode_dht(MJpegDecodeContext *s); |
868 | 893 |
869 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table, | 894 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table, |
870 int nb_codes, int use_static) | 895 int nb_codes, int use_static) |
1519 break; | 1544 break; |
1520 } | 1545 } |
1521 #endif | 1546 #endif |
1522 } | 1547 } |
1523 | 1548 |
1524 predictor= get_bits(&s->gb, 8); /* lossless predictor or start of spectral (Ss) */ | 1549 predictor= get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */ |
1525 skip_bits(&s->gb, 8); /* Se */ | 1550 int ilv= get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */ |
1526 skip_bits(&s->gb, 4); /* Ah */ | 1551 skip_bits(&s->gb, 4); /* Ah */ |
1527 point_transform= get_bits(&s->gb, 4); /* Al */ | 1552 point_transform= get_bits(&s->gb, 4); /* Al */ |
1528 | 1553 |
1529 for(i=0;i<nb_components;i++) | 1554 for(i=0;i<nb_components;i++) |
1530 s->last_dc[i] = 1024; | 1555 s->last_dc[i] = 1024; |
1542 s->h_scount[0] = 1; | 1567 s->h_scount[0] = 1; |
1543 s->v_scount[0] = 1; | 1568 s->v_scount[0] = 1; |
1544 } | 1569 } |
1545 | 1570 |
1546 if(s->avctx->debug & FF_DEBUG_PICT_INFO) | 1571 if(s->avctx->debug & FF_DEBUG_PICT_INFO) |
1547 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform); | 1572 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d %s\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", |
1573 predictor, point_transform, ilv, s->bits, | |
1574 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : "")); | |
1575 | |
1548 | 1576 |
1549 /* mjpeg-b can have padding bytes between sos and image data, skip them */ | 1577 /* mjpeg-b can have padding bytes between sos and image data, skip them */ |
1550 for (i = s->mjpb_skiptosod; i > 0; i--) | 1578 for (i = s->mjpb_skiptosod; i > 0; i--) |
1551 skip_bits(&s->gb, 8); | 1579 skip_bits(&s->gb, 8); |
1552 | 1580 |
1553 if(s->lossless){ | 1581 if(s->lossless){ |
1582 if(s->ls){ | |
1583 // for(){ | |
1584 }else{ | |
1554 if(s->rgb){ | 1585 if(s->rgb){ |
1555 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0) | 1586 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0) |
1556 return -1; | 1587 return -1; |
1557 }else{ | 1588 }else{ |
1558 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0) | 1589 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0) |
1559 return -1; | 1590 return -1; |
1560 } | 1591 } |
1592 } | |
1561 }else{ | 1593 }else{ |
1562 if(mjpeg_decode_scan(s) < 0) | 1594 if(mjpeg_decode_scan(s) < 0) |
1563 return -1; | 1595 return -1; |
1564 } | 1596 } |
1565 emms_c(); | 1597 emms_c(); |
1892 } | 1924 } |
1893 | 1925 |
1894 switch(start_code) { | 1926 switch(start_code) { |
1895 case SOI: | 1927 case SOI: |
1896 s->restart_interval = 0; | 1928 s->restart_interval = 0; |
1929 reset_ls_coding_parameters(s, 1); | |
1930 | |
1897 s->restart_count = 0; | 1931 s->restart_count = 0; |
1898 /* nothing to do on SOI */ | 1932 /* nothing to do on SOI */ |
1899 break; | 1933 break; |
1900 case DQT: | 1934 case DQT: |
1901 mjpeg_decode_dqt(s); | 1935 mjpeg_decode_dqt(s); |
1913 break; | 1947 break; |
1914 case SOF3: | 1948 case SOF3: |
1915 s->lossless=1; | 1949 s->lossless=1; |
1916 if (mjpeg_decode_sof(s) < 0) | 1950 if (mjpeg_decode_sof(s) < 0) |
1917 return -1; | 1951 return -1; |
1952 break; | |
1953 case SOF48: | |
1954 s->lossless=1; | |
1955 s->ls=1; | |
1956 if (mjpeg_decode_sof(s) < 0) | |
1957 return -1; | |
1958 break; | |
1959 case LSE: | |
1960 if (decode_lse(s) < 0) | |
1961 return -1; | |
1918 break; | 1962 break; |
1919 case EOI: | 1963 case EOI: |
1920 if ((s->buggy_avid && !s->interlaced) || s->restart_interval) | 1964 if ((s->buggy_avid && !s->interlaced) || s->restart_interval) |
1921 break; | 1965 break; |
1922 eoi_parser: | 1966 eoi_parser: |