Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * lossless JPEG shared bits
  3.  * Copyright (c) 2000, 2001 Fabrice Bellard
  4.  * Copyright (c) 2003 Alex Beregszaszi
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include <stdint.h>
  24. #include <string.h>
  25.  
  26. #include "libavutil/common.h"
  27. #include "libavutil/pixdesc.h"
  28. #include "libavutil/pixfmt.h"
  29.  
  30. #include "avcodec.h"
  31. #include "idctdsp.h"
  32. #include "jpegtables.h"
  33. #include "put_bits.h"
  34. #include "mjpegenc.h"
  35. #include "mjpegenc_common.h"
  36. #include "mjpeg.h"
  37.  
  38. /* table_class: 0 = DC coef, 1 = AC coefs */
  39. static int put_huffman_table(PutBitContext *p, int table_class, int table_id,
  40.                              const uint8_t *bits_table, const uint8_t *value_table)
  41. {
  42.     int n, i;
  43.  
  44.     put_bits(p, 4, table_class);
  45.     put_bits(p, 4, table_id);
  46.  
  47.     n = 0;
  48.     for(i=1;i<=16;i++) {
  49.         n += bits_table[i];
  50.         put_bits(p, 8, bits_table[i]);
  51.     }
  52.  
  53.     for(i=0;i<n;i++)
  54.         put_bits(p, 8, value_table[i]);
  55.  
  56.     return n + 17;
  57. }
  58.  
  59. static void jpeg_table_header(AVCodecContext *avctx, PutBitContext *p,
  60.                               ScanTable *intra_scantable,
  61.                               uint16_t luma_intra_matrix[64],
  62.                               uint16_t chroma_intra_matrix[64],
  63.                               int hsample[3])
  64. {
  65.     int i, j, size;
  66.     uint8_t *ptr;
  67.  
  68.     if (avctx->codec_id != AV_CODEC_ID_LJPEG) {
  69.         int matrix_count = 1 + !!memcmp(luma_intra_matrix,
  70.                                         chroma_intra_matrix,
  71.                                         sizeof(luma_intra_matrix[0]) * 64);
  72.     /* quant matrixes */
  73.     put_marker(p, DQT);
  74.     put_bits(p, 16, 2 + matrix_count * (1 + 64));
  75.     put_bits(p, 4, 0); /* 8 bit precision */
  76.     put_bits(p, 4, 0); /* table 0 */
  77.     for(i=0;i<64;i++) {
  78.         j = intra_scantable->permutated[i];
  79.         put_bits(p, 8, luma_intra_matrix[j]);
  80.     }
  81.  
  82.         if (matrix_count > 1) {
  83.             put_bits(p, 4, 0); /* 8 bit precision */
  84.             put_bits(p, 4, 1); /* table 1 */
  85.             for(i=0;i<64;i++) {
  86.                 j = intra_scantable->permutated[i];
  87.                 put_bits(p, 8, chroma_intra_matrix[j]);
  88.             }
  89.         }
  90.     }
  91.  
  92.     if(avctx->active_thread_type & FF_THREAD_SLICE){
  93.         put_marker(p, DRI);
  94.         put_bits(p, 16, 4);
  95.         put_bits(p, 16, (avctx->width-1)/(8*hsample[0]) + 1);
  96.     }
  97.  
  98.     /* huffman table */
  99.     put_marker(p, DHT);
  100.     flush_put_bits(p);
  101.     ptr = put_bits_ptr(p);
  102.     put_bits(p, 16, 0); /* patched later */
  103.     size = 2;
  104.     size += put_huffman_table(p, 0, 0, avpriv_mjpeg_bits_dc_luminance,
  105.                               avpriv_mjpeg_val_dc);
  106.     size += put_huffman_table(p, 0, 1, avpriv_mjpeg_bits_dc_chrominance,
  107.                               avpriv_mjpeg_val_dc);
  108.  
  109.     size += put_huffman_table(p, 1, 0, avpriv_mjpeg_bits_ac_luminance,
  110.                               avpriv_mjpeg_val_ac_luminance);
  111.     size += put_huffman_table(p, 1, 1, avpriv_mjpeg_bits_ac_chrominance,
  112.                               avpriv_mjpeg_val_ac_chrominance);
  113.     AV_WB16(ptr, size);
  114. }
  115.  
  116. static void jpeg_put_comments(AVCodecContext *avctx, PutBitContext *p)
  117. {
  118.     int size;
  119.     uint8_t *ptr;
  120.  
  121.     if (avctx->sample_aspect_ratio.num > 0 && avctx->sample_aspect_ratio.den > 0) {
  122.         /* JFIF header */
  123.         put_marker(p, APP0);
  124.         put_bits(p, 16, 16);
  125.         avpriv_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
  126.         /* The most significant byte is used for major revisions, the least
  127.          * significant byte for minor revisions. Version 1.02 is the current
  128.          * released revision. */
  129.         put_bits(p, 16, 0x0102);
  130.         put_bits(p,  8, 0);              /* units type: 0 - aspect ratio */
  131.         put_bits(p, 16, avctx->sample_aspect_ratio.num);
  132.         put_bits(p, 16, avctx->sample_aspect_ratio.den);
  133.         put_bits(p, 8, 0); /* thumbnail width */
  134.         put_bits(p, 8, 0); /* thumbnail height */
  135.     }
  136.  
  137.     /* comment */
  138.     if (!(avctx->flags & AV_CODEC_FLAG_BITEXACT)) {
  139.         put_marker(p, COM);
  140.         flush_put_bits(p);
  141.         ptr = put_bits_ptr(p);
  142.         put_bits(p, 16, 0); /* patched later */
  143.         avpriv_put_string(p, LIBAVCODEC_IDENT, 1);
  144.         size = strlen(LIBAVCODEC_IDENT)+3;
  145.         AV_WB16(ptr, size);
  146.     }
  147.  
  148.     if (((avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
  149.           avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
  150.           avctx->pix_fmt == AV_PIX_FMT_YUV444P) && avctx->color_range != AVCOL_RANGE_JPEG)
  151.         || avctx->color_range == AVCOL_RANGE_MPEG) {
  152.         put_marker(p, COM);
  153.         flush_put_bits(p);
  154.         ptr = put_bits_ptr(p);
  155.         put_bits(p, 16, 0); /* patched later */
  156.         avpriv_put_string(p, "CS=ITU601", 1);
  157.         size = strlen("CS=ITU601")+3;
  158.         AV_WB16(ptr, size);
  159.     }
  160. }
  161.  
  162. void ff_mjpeg_init_hvsample(AVCodecContext *avctx, int hsample[3], int vsample[3])
  163. {
  164.     int chroma_h_shift, chroma_v_shift;
  165.  
  166.     av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift,
  167.                                      &chroma_v_shift);
  168.     if (avctx->codec->id == AV_CODEC_ID_LJPEG &&
  169.         (   avctx->pix_fmt == AV_PIX_FMT_BGR0
  170.          || avctx->pix_fmt == AV_PIX_FMT_BGRA
  171.          || avctx->pix_fmt == AV_PIX_FMT_BGR24)) {
  172.         vsample[0] = hsample[0] =
  173.         vsample[1] = hsample[1] =
  174.         vsample[2] = hsample[2] = 1;
  175.     } else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUVJ444P) {
  176.         vsample[0] = vsample[1] = vsample[2] = 2;
  177.         hsample[0] = hsample[1] = hsample[2] = 1;
  178.     } else {
  179.         vsample[0] = 2;
  180.         vsample[1] = 2 >> chroma_v_shift;
  181.         vsample[2] = 2 >> chroma_v_shift;
  182.         hsample[0] = 2;
  183.         hsample[1] = 2 >> chroma_h_shift;
  184.         hsample[2] = 2 >> chroma_h_shift;
  185.     }
  186. }
  187.  
  188. void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb,
  189.                                     ScanTable *intra_scantable,
  190.                                     uint16_t luma_intra_matrix[64],
  191.                                     uint16_t chroma_intra_matrix[64])
  192. {
  193.     const int lossless = avctx->codec_id != AV_CODEC_ID_MJPEG && avctx->codec_id != AV_CODEC_ID_AMV;
  194.     int hsample[3], vsample[3];
  195.     int i;
  196.     int chroma_matrix = !!memcmp(luma_intra_matrix,
  197.                                  chroma_intra_matrix,
  198.                                  sizeof(luma_intra_matrix[0])*64);
  199.  
  200.     ff_mjpeg_init_hvsample(avctx, hsample, vsample);
  201.  
  202.     put_marker(pb, SOI);
  203.  
  204.     // hack for AMV mjpeg format
  205.     if(avctx->codec_id == AV_CODEC_ID_AMV) goto end;
  206.  
  207.     jpeg_put_comments(avctx, pb);
  208.  
  209.     jpeg_table_header(avctx, pb, intra_scantable, luma_intra_matrix, chroma_intra_matrix, hsample);
  210.  
  211.     switch (avctx->codec_id) {
  212.     case AV_CODEC_ID_MJPEG:  put_marker(pb, SOF0 ); break;
  213.     case AV_CODEC_ID_LJPEG:  put_marker(pb, SOF3 ); break;
  214.     default: av_assert0(0);
  215.     }
  216.  
  217.     put_bits(pb, 16, 17);
  218.     if (lossless && (  avctx->pix_fmt == AV_PIX_FMT_BGR0
  219.                     || avctx->pix_fmt == AV_PIX_FMT_BGRA
  220.                     || avctx->pix_fmt == AV_PIX_FMT_BGR24))
  221.         put_bits(pb, 8, 9); /* 9 bits/component RCT */
  222.     else
  223.         put_bits(pb, 8, 8); /* 8 bits/component */
  224.     put_bits(pb, 16, avctx->height);
  225.     put_bits(pb, 16, avctx->width);
  226.     put_bits(pb, 8, 3); /* 3 components */
  227.  
  228.     /* Y component */
  229.     put_bits(pb, 8, 1); /* component number */
  230.     put_bits(pb, 4, hsample[0]); /* H factor */
  231.     put_bits(pb, 4, vsample[0]); /* V factor */
  232.     put_bits(pb, 8, 0); /* select matrix */
  233.  
  234.     /* Cb component */
  235.     put_bits(pb, 8, 2); /* component number */
  236.     put_bits(pb, 4, hsample[1]); /* H factor */
  237.     put_bits(pb, 4, vsample[1]); /* V factor */
  238.     put_bits(pb, 8, lossless ? 0 : chroma_matrix); /* select matrix */
  239.  
  240.     /* Cr component */
  241.     put_bits(pb, 8, 3); /* component number */
  242.     put_bits(pb, 4, hsample[2]); /* H factor */
  243.     put_bits(pb, 4, vsample[2]); /* V factor */
  244.     put_bits(pb, 8, lossless ? 0 : chroma_matrix); /* select matrix */
  245.  
  246.     /* scan header */
  247.     put_marker(pb, SOS);
  248.     put_bits(pb, 16, 12); /* length */
  249.     put_bits(pb, 8, 3); /* 3 components */
  250.  
  251.     /* Y component */
  252.     put_bits(pb, 8, 1); /* index */
  253.     put_bits(pb, 4, 0); /* DC huffman table index */
  254.     put_bits(pb, 4, 0); /* AC huffman table index */
  255.  
  256.     /* Cb component */
  257.     put_bits(pb, 8, 2); /* index */
  258.     put_bits(pb, 4, 1); /* DC huffman table index */
  259.     put_bits(pb, 4, lossless ? 0 : 1); /* AC huffman table index */
  260.  
  261.     /* Cr component */
  262.     put_bits(pb, 8, 3); /* index */
  263.     put_bits(pb, 4, 1); /* DC huffman table index */
  264.     put_bits(pb, 4, lossless ? 0 : 1); /* AC huffman table index */
  265.  
  266.     put_bits(pb, 8, lossless ? avctx->prediction_method + 1 : 0); /* Ss (not used) */
  267.  
  268.     switch (avctx->codec_id) {
  269.     case AV_CODEC_ID_MJPEG:  put_bits(pb, 8, 63); break; /* Se (not used) */
  270.     case AV_CODEC_ID_LJPEG:  put_bits(pb, 8,  0); break; /* not used */
  271.     default: av_assert0(0);
  272.     }
  273.  
  274.     put_bits(pb, 8, 0); /* Ah/Al (not used) */
  275.  
  276. end:
  277.     if (!lossless) {
  278.         MpegEncContext *s = avctx->priv_data;
  279.         av_assert0(avctx->codec->priv_data_size == sizeof(MpegEncContext));
  280.  
  281.         s->esc_pos = put_bits_count(pb) >> 3;
  282.         for(i=1; i<s->slice_context_count; i++)
  283.             s->thread_context[i]->esc_pos = 0;
  284.     }
  285. }
  286.  
  287. void ff_mjpeg_escape_FF(PutBitContext *pb, int start)
  288. {
  289.     int size;
  290.     int i, ff_count;
  291.     uint8_t *buf = pb->buf + start;
  292.     int align= (-(size_t)(buf))&3;
  293.     int pad = (-put_bits_count(pb))&7;
  294.  
  295.     if (pad)
  296.         put_bits(pb, pad, (1<<pad)-1);
  297.  
  298.     flush_put_bits(pb);
  299.     size = put_bits_count(pb) - start * 8;
  300.  
  301.     av_assert1((size&7) == 0);
  302.     size >>= 3;
  303.  
  304.     ff_count=0;
  305.     for(i=0; i<size && i<align; i++){
  306.         if(buf[i]==0xFF) ff_count++;
  307.     }
  308.     for(; i<size-15; i+=16){
  309.         int acc, v;
  310.  
  311.         v= *(uint32_t*)(&buf[i]);
  312.         acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
  313.         v= *(uint32_t*)(&buf[i+4]);
  314.         acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
  315.         v= *(uint32_t*)(&buf[i+8]);
  316.         acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
  317.         v= *(uint32_t*)(&buf[i+12]);
  318.         acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
  319.  
  320.         acc>>=4;
  321.         acc+= (acc>>16);
  322.         acc+= (acc>>8);
  323.         ff_count+= acc&0xFF;
  324.     }
  325.     for(; i<size; i++){
  326.         if(buf[i]==0xFF) ff_count++;
  327.     }
  328.  
  329.     if(ff_count==0) return;
  330.  
  331.     flush_put_bits(pb);
  332.     skip_put_bytes(pb, ff_count);
  333.  
  334.     for(i=size-1; ff_count; i--){
  335.         int v= buf[i];
  336.  
  337.         if(v==0xFF){
  338.             buf[i+ff_count]= 0;
  339.             ff_count--;
  340.         }
  341.  
  342.         buf[i+ff_count]= v;
  343.     }
  344. }
  345.  
  346. int ff_mjpeg_encode_stuffing(MpegEncContext *s)
  347. {
  348.     int i;
  349.     PutBitContext *pbc = &s->pb;
  350.     int mb_y = s->mb_y - !s->mb_x;
  351.  
  352.     int ret = ff_mpv_reallocate_putbitbuffer(s, put_bits_count(&s->pb) / 8 + 100,
  353.                                                 put_bits_count(&s->pb) / 4 + 1000);
  354.     if (ret < 0) {
  355.         av_log(s->avctx, AV_LOG_ERROR, "Buffer reallocation failed\n");
  356.         goto fail;
  357.     }
  358.  
  359.     ff_mjpeg_escape_FF(pbc, s->esc_pos);
  360.  
  361.     if((s->avctx->active_thread_type & FF_THREAD_SLICE) && mb_y < s->mb_height)
  362.         put_marker(pbc, RST0 + (mb_y&7));
  363.     s->esc_pos = put_bits_count(pbc) >> 3;
  364. fail:
  365.  
  366.     for(i=0; i<3; i++)
  367.         s->last_dc[i] = 128 << s->intra_dc_precision;
  368.  
  369.     return ret;
  370. }
  371.  
  372. void ff_mjpeg_encode_picture_trailer(PutBitContext *pb, int header_bits)
  373. {
  374.     av_assert1((header_bits & 7) == 0);
  375.  
  376.     put_marker(pb, EOI);
  377. }
  378.  
  379. void ff_mjpeg_encode_dc(PutBitContext *pb, int val,
  380.                         uint8_t *huff_size, uint16_t *huff_code)
  381. {
  382.     int mant, nbits;
  383.  
  384.     if (val == 0) {
  385.         put_bits(pb, huff_size[0], huff_code[0]);
  386.     } else {
  387.         mant = val;
  388.         if (val < 0) {
  389.             val = -val;
  390.             mant--;
  391.         }
  392.  
  393.         nbits= av_log2_16bit(val) + 1;
  394.  
  395.         put_bits(pb, huff_size[nbits], huff_code[nbits]);
  396.  
  397.         put_sbits(pb, nbits, mant);
  398.     }
  399. }
  400.