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

📄 mjpeg.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
    *data_size = 0;    /* no supplementary picture */    if (buf_size == 0)        return 0;    buf_ptr = buf;    buf_end = buf + buf_size;    while (buf_ptr < buf_end) {        /* find start next marker */        start_code = find_marker(&buf_ptr, buf_end);	{	    /* EOF */            if (start_code < 0) {		goto the_end;            } else {                dprintf("marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);				if ((buf_end - buf_ptr) > s->buffer_size)		{		    av_free(s->buffer);		    s->buffer_size = buf_end-buf_ptr;		    s->buffer = av_malloc(s->buffer_size);		    dprintf("buffer too small, expanding to %d bytes\n",			s->buffer_size);		}				/* unescape buffer of SOS */		if (start_code == SOS)		{		    uint8_t *src = buf_ptr;		    uint8_t *dst = s->buffer;		    while (src<buf_end)		    {			uint8_t x = *(src++);			*(dst++) = x;			if (x == 0xff)			{			    while(*src == 0xff) src++;			    x = *(src++);			    if (x >= 0xd0 && x <= 0xd7)				*(dst++) = x;			    else if (x)				break;			}		    }		    init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);		    		    dprintf("escaping removed %d bytes\n",			(buf_end - buf_ptr) - (dst - s->buffer));		}		else		    init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);				s->start_code = start_code;                if(s->avctx->debug & FF_DEBUG_STARTCODE){                    av_log(s->avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);                }		/* process markers */		if (start_code >= 0xd0 && start_code <= 0xd7) {		    dprintf("restart marker: %d\n", start_code&0x0f);		} else if (s->first_picture) {		    /* APP fields */		    if (start_code >= 0xe0 && start_code <= 0xef)			mjpeg_decode_app(s);		    /* Comment */		    else if (start_code == COM)			mjpeg_decode_com(s);		}                switch(start_code) {                case SOI:		    s->restart_interval = 0;                    /* nothing to do on SOI */                    break;                case DQT:                    mjpeg_decode_dqt(s);                    break;                case DHT:                    if(mjpeg_decode_dht(s) < 0){                        av_log(s->avctx, AV_LOG_ERROR, "huffman table decode error\n");                        return -1;                    }                    break;                case SOF0:                    s->lossless=0;                    if (mjpeg_decode_sof(s) < 0) 			return -1;                    break;                case SOF3:                    s->lossless=1;                    if (mjpeg_decode_sof(s) < 0) 			return -1;                    break;		case EOI:		    if ((s->buggy_avid && !s->interlaced) || s->restart_interval)                         break;eoi_parser:		    {                        if (s->interlaced) {                            s->bottom_field ^= 1;                            /* if not bottom field, do not output image yet */                            if (s->bottom_field)                                goto not_the_end;                        }                        *picture = s->picture;                        *data_size = sizeof(AVFrame);                        avctx->height = s->height;                        if (s->interlaced)                            avctx->height *= 2;                        avctx->width = s->width;                        if(!s->lossless){                            picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);                             picture->qstride= 0;                            picture->qscale_table= s->qscale_table;                            memset(picture->qscale_table, picture->quality, (s->width+15)/16);                            if(avctx->debug & FF_DEBUG_QP)                                av_log(s->avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);                            picture->quality*= FF_QP2LAMBDA;                        }                                                goto the_end;                    }		    break;                case SOS:                    mjpeg_decode_sos(s);		    /* buggy avid puts EOI every 10-20th frame */		    /* if restart period is over process EOI */		    if ((s->buggy_avid && !s->interlaced) || s->restart_interval)			goto eoi_parser;                    break;		case DRI:		    mjpeg_decode_dri(s);		    break;		case SOF1:		case SOF2:		case SOF5:		case SOF6:		case SOF7:		case SOF9:		case SOF10:		case SOF11:		case SOF13:		case SOF14:		case SOF15:		case JPG:		    av_log(s->avctx, AV_LOG_ERROR, "mjpeg: unsupported coding type (%x)\n", start_code);		    break;//		default://		    printf("mjpeg: unsupported marker (%x)\n", start_code);//		    break;                }not_the_end:		/* eof process start code */		buf_ptr += (get_bits_count(&s->gb)+7)/8;		dprintf("marker parser used %d bytes (%d bits)\n",		    (get_bits_count(&s->gb)+7)/8, get_bits_count(&s->gb));            }        }    }the_end:    dprintf("mjpeg decode frame unused %d bytes\n", buf_end - buf_ptr);//    return buf_end - buf_ptr;    return buf_ptr - buf;}static int mjpegb_decode_frame(AVCodecContext *avctx,                               void *data, int *data_size,                              uint8_t *buf, int buf_size){    MJpegDecodeContext *s = avctx->priv_data;    uint8_t *buf_end, *buf_ptr;    AVFrame *picture = data;    GetBitContext hgb; /* for the header */    uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;    uint32_t field_size;    *data_size = 0;    /* no supplementary picture */    if (buf_size == 0)        return 0;    buf_ptr = buf;    buf_end = buf + buf_size;    read_header:    /* reset on every SOI */    s->restart_interval = 0;    init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);    skip_bits(&hgb, 32); /* reserved zeros */        if (get_bits(&hgb, 32) != be2me_32(ff_get_fourcc("mjpg")))    {	dprintf("not mjpeg-b (bad fourcc)\n");	return 0;    }    field_size = get_bits(&hgb, 32); /* field size */    dprintf("field size: 0x%x\n", field_size);    skip_bits(&hgb, 32); /* padded field size */    second_field_offs = get_bits(&hgb, 32);    dprintf("second field offs: 0x%x\n", second_field_offs);    if (second_field_offs)	s->interlaced = 1;    dqt_offs = get_bits(&hgb, 32);    dprintf("dqt offs: 0x%x\n", dqt_offs);    if (dqt_offs)    {	init_get_bits(&s->gb, buf+dqt_offs, (buf_end - (buf+dqt_offs))*8);	s->start_code = DQT;	mjpeg_decode_dqt(s);    }        dht_offs = get_bits(&hgb, 32);    dprintf("dht offs: 0x%x\n", dht_offs);    if (dht_offs)    {	init_get_bits(&s->gb, buf+dht_offs, (buf_end - (buf+dht_offs))*8);	s->start_code = DHT;	mjpeg_decode_dht(s);    }    sof_offs = get_bits(&hgb, 32);    dprintf("sof offs: 0x%x\n", sof_offs);    if (sof_offs)    {	init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8);	s->start_code = SOF0;	if (mjpeg_decode_sof(s) < 0)	    return -1;    }    sos_offs = get_bits(&hgb, 32);    dprintf("sos offs: 0x%x\n", sos_offs);    if (sos_offs)    {//	init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);	init_get_bits(&s->gb, buf+sos_offs, field_size*8);	s->start_code = SOS;	mjpeg_decode_sos(s);    }    skip_bits(&hgb, 32); /* start of data offset */    if (s->interlaced) {        s->bottom_field ^= 1;        /* if not bottom field, do not output image yet */        if (s->bottom_field && second_field_offs)	{	    buf_ptr = buf + second_field_offs;	    second_field_offs = 0;	    goto read_header;    	}    }    //XXX FIXME factorize, this looks very similar to the EOI code    *picture= s->picture;    *data_size = sizeof(AVFrame);    avctx->height = s->height;    if (s->interlaced)        avctx->height *= 2;    avctx->width = s->width;        if(!s->lossless){        picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);         picture->qstride= 0;        picture->qscale_table= s->qscale_table;        memset(picture->qscale_table, picture->quality, (s->width+15)/16);        if(avctx->debug & FF_DEBUG_QP)            av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);        picture->quality*= FF_QP2LAMBDA;    }    return buf_ptr - buf;}#include "sp5x.h"static int sp5x_decode_frame(AVCodecContext *avctx,                               void *data, int *data_size,                              uint8_t *buf, int buf_size){#if 0    MJpegDecodeContext *s = avctx->priv_data;#endif    const int qscale = 5;    uint8_t *buf_ptr, *buf_end, *recoded;    int i = 0, j = 0;    *data_size = 0;    /* no supplementary picture */    if (buf_size == 0)        return 0;    if (!avctx->width || !avctx->height)	return -1;    buf_ptr = buf;    buf_end = buf + buf_size;#if 1    recoded = av_mallocz(buf_size + 1024);    if (!recoded)	return -1;    /* SOI */    recoded[j++] = 0xFF;    recoded[j++] = 0xD8;    memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));    memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);    memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);    j += sizeof(sp5x_data_dqt);    memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));    j += sizeof(sp5x_data_dht);    memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));    recoded[j+5] = (avctx->height >> 8) & 0xFF;    recoded[j+6] = avctx->height & 0xFF;    recoded[j+7] = (avctx->width >> 8) & 0xFF;    recoded[j+8] = avctx->width & 0xFF;    j += sizeof(sp5x_data_sof);    memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));    j += sizeof(sp5x_data_sos);    for (i = 14; i < buf_size && j < buf_size+1024-2; i++)    {	recoded[j++] = buf[i];	if (buf[i] == 0xff)	    recoded[j++] = 0;    }    /* EOI */    recoded[j++] = 0xFF;    recoded[j++] = 0xD9;    i = mjpeg_decode_frame(avctx, data, data_size, recoded, j);    av_free(recoded);#else    /* SOF */    s->bits = 8;    s->width = avctx->width;    s->height = avctx->height;    s->nb_components = 3;    s->component_id[0] = 0;    s->h_count[0] = 2;    s->v_count[0] = 2;    s->quant_index[0] = 0;    s->component_id[1] = 1;    s->h_count[1] = 1;    s->v_count[1] = 1;    s->quant_index[1] = 1;    s->component_id[2] = 2;    s->h_count[2] = 1;    s->v_count[2] = 1;    s->quant_index[2] = 1;    s->h_max = 2;    s->v_max = 2;        s->qscale_table = av_mallocz((s->width+15)/16);    avctx->pix_fmt = PIX_FMT_YUV420P;    s->interlaced = 0;        s->picture.reference = 0;    if (avctx->get_buffer(avctx, &s->picture) < 0)    {	fprintf(stderr, "get_buffer() failed\n");	return -1;    }    s->picture.pict_type = I_TYPE;    s->picture.key_frame = 1;    for (i = 0; i < 3; i++)	s->linesize[i] = s->picture.linesize[i] << s->interlaced;    /* DQT */    for (i = 0; i < 64; i++)    {	j = s->scantable.permutated[i];	s->quant_matrixes[0][j] = sp5x_quant_table[(qscale * 2) + i];    }    s->qscale[0] = FFMAX(	s->quant_matrixes[0][s->scantable.permutated[1]],	s->quant_matrixes[0][s->scantable.permutated[8]]) >> 1;    for (i = 0; i < 64; i++)    {	j = s->scantable.permutated[i];	s->quant_matrixes[1][j] = sp5x_quant_table[(qscale * 2) + 1 + i];    }    s->qscale[1] = FFMAX(	s->quant_matrixes[1][s->scantable.permutated[1]],	s->quant_matrixes[1][s->scantable.permutated[8]]) >> 1;    /* DHT */    /* SOS */    s->comp_index[0] = 0;    s->nb_blocks[0] = s->h_count[0] * s->v_count[0];    s->h_scount[0] = s->h_count[0];    s->v_scount[0] = s->v_count[0];    s->dc_index[0] = 0;    s->ac_index[0] = 0;    s->comp_index[1] = 1;    s->nb_blocks[1] = s->h_count[1] * s->v_count[1];    s->h_scount[1] = s->h_count[1];    s->v_scount[1] = s->v_count[1];    s-

⌨️ 快捷键说明

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