⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mjpeg.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * MJPEG encoder and decoder * Copyright (c) 2000, 2001 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * Support for external huffman table, various fixes (AVID workaround), * aspecting, new decode_frame mechanism and apple mjpeg-b support *                                  by Alex Beregszaszi <alex@naxine.org> *//** * @file mjpeg.c * MJPEG encoder and decoder. */ //#define DEBUG#include <assert.h>#include "avcodec.h"#include "dsputil.h"#include "mpegvideo.h"/* use two quantizer tables (one for luminance and one for chrominance) *//* not yet working */#undef TWOMATRIXEStypedef struct MJpegContext {    uint8_t huff_size_dc_luminance[12]; //FIXME use array [3] instead of lumi / chrom, for easier addressing     uint16_t huff_code_dc_luminance[12];    uint8_t huff_size_dc_chrominance[12];    uint16_t huff_code_dc_chrominance[12];    uint8_t huff_size_ac_luminance[256];    uint16_t huff_code_ac_luminance[256];    uint8_t huff_size_ac_chrominance[256];    uint16_t huff_code_ac_chrominance[256];} MJpegContext;/* JPEG marker codes */typedef enum {    /* start of frame */    SOF0  = 0xc0,	/* baseline */    SOF1  = 0xc1,	/* extended sequential, huffman */    SOF2  = 0xc2,	/* progressive, huffman */    SOF3  = 0xc3,	/* lossless, huffman */    SOF5  = 0xc5,	/* differential sequential, huffman */    SOF6  = 0xc6,	/* differential progressive, huffman */    SOF7  = 0xc7,	/* differential lossless, huffman */    JPG   = 0xc8,	/* reserved for JPEG extension */    SOF9  = 0xc9,	/* extended sequential, arithmetic */    SOF10 = 0xca,	/* progressive, arithmetic */    SOF11 = 0xcb,	/* lossless, arithmetic */    SOF13 = 0xcd,	/* differential sequential, arithmetic */    SOF14 = 0xce,	/* differential progressive, arithmetic */    SOF15 = 0xcf,	/* differential lossless, arithmetic */    DHT   = 0xc4,	/* define huffman tables */    DAC   = 0xcc,	/* define arithmetic-coding conditioning */    /* restart with modulo 8 count "m" */    RST0  = 0xd0,    RST1  = 0xd1,    RST2  = 0xd2,    RST3  = 0xd3,    RST4  = 0xd4,    RST5  = 0xd5,    RST6  = 0xd6,    RST7  = 0xd7,    SOI   = 0xd8,	/* start of image */    EOI   = 0xd9,	/* end of image */    SOS   = 0xda,	/* start of scan */    DQT   = 0xdb,	/* define quantization tables */    DNL   = 0xdc,	/* define number of lines */    DRI   = 0xdd,	/* define restart interval */    DHP   = 0xde,	/* define hierarchical progression */    EXP   = 0xdf,	/* expand reference components */    APP0  = 0xe0,    APP1  = 0xe1,    APP2  = 0xe2,    APP3  = 0xe3,    APP4  = 0xe4,    APP5  = 0xe5,    APP6  = 0xe6,    APP7  = 0xe7,    APP8  = 0xe8,    APP9  = 0xe9,    APP10 = 0xea,    APP11 = 0xeb,    APP12 = 0xec,    APP13 = 0xed,    APP14 = 0xee,    APP15 = 0xef,    JPG0  = 0xf0,    JPG1  = 0xf1,    JPG2  = 0xf2,    JPG3  = 0xf3,    JPG4  = 0xf4,    JPG5  = 0xf5,    JPG6  = 0xf6,    JPG7  = 0xf7,    JPG8  = 0xf8,    JPG9  = 0xf9,    JPG10 = 0xfa,    JPG11 = 0xfb,    JPG12 = 0xfc,    JPG13 = 0xfd,    COM   = 0xfe,	/* comment */    TEM   = 0x01,	/* temporary private use for arithmetic coding */    /* 0x02 -> 0xbf reserved */} JPEG_MARKER;#if 0/* These are the sample quantization tables given in JPEG spec section K.1. * The spec says that the values given produce "good" quality, and * when divided by 2, "very good" quality. */static const unsigned char std_luminance_quant_tbl[64] = {    16,  11,  10,  16,  24,  40,  51,  61,    12,  12,  14,  19,  26,  58,  60,  55,    14,  13,  16,  24,  40,  57,  69,  56,    14,  17,  22,  29,  51,  87,  80,  62,    18,  22,  37,  56,  68, 109, 103,  77,    24,  35,  55,  64,  81, 104, 113,  92,    49,  64,  78,  87, 103, 121, 120, 101,    72,  92,  95,  98, 112, 100, 103,  99};static const unsigned char std_chrominance_quant_tbl[64] = {    17,  18,  24,  47,  99,  99,  99,  99,    18,  21,  26,  66,  99,  99,  99,  99,    24,  26,  56,  99,  99,  99,  99,  99,    47,  66,  99,  99,  99,  99,  99,  99,    99,  99,  99,  99,  99,  99,  99,  99,    99,  99,  99,  99,  99,  99,  99,  99,    99,  99,  99,  99,  99,  99,  99,  99,    99,  99,  99,  99,  99,  99,  99,  99};#endif/* Set up the standard Huffman tables (cf. JPEG standard section K.3) *//* IMPORTANT: these are only valid for 8-bit data precision! */static const uint8_t bits_dc_luminance[17] ={ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };static const uint8_t val_dc_luminance[] ={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };static const uint8_t bits_dc_chrominance[17] ={ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };static const uint8_t val_dc_chrominance[] ={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };static const uint8_t bits_ac_luminance[17] ={ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };static const uint8_t val_ac_luminance[] ={ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,  0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,  0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,  0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,  0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,  0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,  0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,  0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,  0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,  0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,  0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,  0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,  0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,  0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,  0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,  0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,  0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,  0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,  0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,  0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,  0xf9, 0xfa };static const uint8_t bits_ac_chrominance[17] ={ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };static const uint8_t val_ac_chrominance[] ={ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,  0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,  0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,  0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,  0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,  0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,  0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,  0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,  0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,  0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,  0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,  0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,  0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,  0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,  0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,  0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,  0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,  0xf9, 0xfa };/* isn't this function nicer than the one in the libjpeg ? */static void build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,                                const uint8_t *bits_table, const uint8_t *val_table){    int i, j, k,nb, code, sym;    code = 0;    k = 0;    for(i=1;i<=16;i++) {        nb = bits_table[i];        for(j=0;j<nb;j++) {            sym = val_table[k++];            huff_size[sym] = i;            huff_code[sym] = code;            code++;        }        code <<= 1;    }}#ifdef CONFIG_ENCODERSint mjpeg_init(MpegEncContext *s){    MJpegContext *m;        m = av_malloc(sizeof(MJpegContext));    if (!m)        return -1;        s->min_qcoeff=-1023;    s->max_qcoeff= 1023;    /* build all the huffman tables */    build_huffman_codes(m->huff_size_dc_luminance,                        m->huff_code_dc_luminance,                        bits_dc_luminance,                        val_dc_luminance);    build_huffman_codes(m->huff_size_dc_chrominance,                        m->huff_code_dc_chrominance,                        bits_dc_chrominance,                        val_dc_chrominance);    build_huffman_codes(m->huff_size_ac_luminance,                        m->huff_code_ac_luminance,                        bits_ac_luminance,                        val_ac_luminance);    build_huffman_codes(m->huff_size_ac_chrominance,                        m->huff_code_ac_chrominance,                        bits_ac_chrominance,                        val_ac_chrominance);        s->mjpeg_ctx = m;    return 0;}void mjpeg_close(MpegEncContext *s){    av_free(s->mjpeg_ctx);}#endif //CONFIG_ENCODERS#define PREDICT(ret, topleft, top, left, predictor)\    switch(predictor){\        case 1: ret= left; break;\        case 2: ret= top; break;\        case 3: ret= topleft; break;\        case 4: ret= left   +   top - topleft; break;\        case 5: ret= left   + ((top - topleft)>>1); break;\        case 6: ret= top + ((left   - topleft)>>1); break;\        default:\        case 7: ret= (left + top)>>1; break;\    }#ifdef CONFIG_ENCODERSstatic inline void put_marker(PutBitContext *p, int code){    put_bits(p, 8, 0xff);    put_bits(p, 8, code);}/* table_class: 0 = DC coef, 1 = AC coefs */static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,                             const uint8_t *bits_table, const uint8_t *value_table){    PutBitContext *p = &s->pb;    int n, i;    put_bits(p, 4, table_class);    put_bits(p, 4, table_id);    n = 0;    for(i=1;i<=16;i++) {        n += bits_table[i];        put_bits(p, 8, bits_table[i]);    }    for(i=0;i<n;i++)        put_bits(p, 8, value_table[i]);    return n + 17;}static void jpeg_table_header(MpegEncContext *s){    PutBitContext *p = &s->pb;    int i, j, size;    uint8_t *ptr;    /* quant matrixes */    put_marker(p, DQT);#ifdef TWOMATRIXES    put_bits(p, 16, 2 + 2 * (1 + 64));#else    put_bits(p, 16, 2 + 1 * (1 + 64));#endif    put_bits(p, 4, 0); /* 8 bit precision */    put_bits(p, 4, 0); /* table 0 */    for(i=0;i<64;i++) {        j = s->intra_scantable.permutated[i];        put_bits(p, 8, s->intra_matrix[j]);    }#ifdef TWOMATRIXES    put_bits(p, 4, 0); /* 8 bit precision */    put_bits(p, 4, 1); /* table 1 */    for(i=0;i<64;i++) {        j = s->intra_scantable.permutated[i];        put_bits(p, 8, s->chroma_intra_matrix[j]);    }#endif    /* huffman table */    put_marker(p, DHT);    flush_put_bits(p);    ptr = pbBufPtr(p);    put_bits(p, 16, 0); /* patched later */    size = 2;    size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);    size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);        size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);    size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);    ptr[0] = size >> 8;    ptr[1] = size;}static void jpeg_put_comments(MpegEncContext *s){    PutBitContext *p = &s->pb;    int size;    uint8_t *ptr;    if (s->aspect_ratio_info /* && !lossless */)    {    /* JFIF header */    put_marker(p, APP0);    put_bits(p, 16, 16);    put_string(p, "JFIF"); /* this puts the trailing zero-byte too */    put_bits(p, 16, 0x0201); /* v 1.02 */    put_bits(p, 8, 0); /* units type: 0 - aspect ratio */    put_bits(p, 16, s->avctx->sample_aspect_ratio.num);    put_bits(p, 16, s->avctx->sample_aspect_ratio.den);    put_bits(p, 8, 0); /* thumbnail width */    put_bits(p, 8, 0); /* thumbnail height */    }    /* comment */    if(!(s->flags & CODEC_FLAG_BITEXACT)){        put_marker(p, COM);        flush_put_bits(p);        ptr = pbBufPtr(p);        put_bits(p, 16, 0); /* patched later */        put_string(p, LIBAVCODEC_IDENT);        size = strlen(LIBAVCODEC_IDENT)+3;        ptr[0] = size >> 8;        ptr[1] = size;    }}void mjpeg_picture_header(MpegEncContext *s){    const int lossless= s->avctx->codec_id == CODEC_ID_LJPEG;    put_marker(&s->pb, SOI);    if (!s->mjpeg_data_only_frames)    {    jpeg_put_comments(s);        if (s->mjpeg_write_tables) jpeg_table_header(s);    put_marker(&s->pb, lossless ? SOF3 : SOF0);    put_bits(&s->pb, 16, 17);    if(lossless && s->avctx->pix_fmt == PIX_FMT_RGBA32)        put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */    else        put_bits(&s->pb, 8, 8); /* 8 bits/component */    put_bits(&s->pb, 16, s->height);    put_bits(&s->pb, 16, s->width);    put_bits(&s->pb, 8, 3); /* 3 components */        /* Y component */    put_bits(&s->pb, 8, 1); /* component number */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -