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

📄 dv.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
               standard IDCT */            dc += 1024;            block[0] = dc;            last_index = block_sizes[j];            buf_ptr += last_index >> 3;            mb->pos = 0;            mb->partial_bit_count = 0;            dv_decode_ac(s, mb, block, last_index);            /* write the remaining bits  in a new buffer only if the               block is finished */            bits_left = last_index - s->gb.index;            if (mb->eob_reached) {                mb->partial_bit_count = 0;                mb_bit_count += bits_left;                bit_copy(&pb, &s->gb, bits_left);            } else {                /* should be < 16 bits otherwise a codeword could have                   been parsed */                mb->partial_bit_count = bits_left;                mb->partial_bit_buffer = get_bits(&s->gb, bits_left);            }            block += 64;            mb++;        }                flush_put_bits(&pb);        /* pass 2 : we can do it just after */#ifdef VLC_DEBUG        printf("***pass 2 size=%d\n", mb_bit_count);#endif        block = block1;        mb = mb1;        init_get_bits(&s->gb, mb_bit_buffer, 80);        for(j = 0;j < 6; j++) {            if (!mb->eob_reached && s->gb.index < mb_bit_count) {                dv_decode_ac(s, mb, block, mb_bit_count);                /* if still not finished, no need to parse other blocks */                if (!mb->eob_reached) {                    /* we could not parse the current AC coefficient,                       so we add the remaining bytes */                    bits_left = mb_bit_count - s->gb.index;                    if (bits_left > 0) {                        mb->partial_bit_count += bits_left;                        mb->partial_bit_buffer =                             (mb->partial_bit_buffer << bits_left) |                             get_bits(&s->gb, bits_left);                    }                    goto next_mb;                }            }            block += 64;            mb++;        }        /* all blocks are finished, so the extra bytes can be used at           the video segment level */        bits_left = mb_bit_count - s->gb.index;        vs_bit_count += bits_left;        bit_copy(&vs_pb, &s->gb, bits_left);    next_mb:        mb1 += 6;        block1 += 6 * 64;    }    /* we need a pass other the whole video segment */    flush_put_bits(&vs_pb);        #ifdef VLC_DEBUG    printf("***pass 3 size=%d\n", vs_bit_count);#endif    block = &s->block[0][0];    mb = mb_data;    init_get_bits(&s->gb, vs_bit_buffer, 5 * 80);    for(mb_index = 0; mb_index < 5; mb_index++) {        for(j = 0;j < 6; j++) {            if (!mb->eob_reached) {#ifdef VLC_DEBUG                printf("start %d:%d\n", mb_index, j);#endif                dv_decode_ac(s, mb, block, vs_bit_count);            }            block += 64;            mb++;        }    }        /* compute idct and place blocks */    block = &s->block[0][0];    mb = mb_data;    for(mb_index = 0; mb_index < 5; mb_index++) {        v = *mb_pos_ptr++;        mb_x = v & 0xff;        mb_y = v >> 8;        y_ptr = s->current_picture[0] + (mb_y * s->linesize[0] * 8) + (mb_x * 8);        if (s->sampling_411)            c_offset = (mb_y * s->linesize[1] * 8) + ((mb_x >> 2) * 8);        else            c_offset = ((mb_y >> 1) * s->linesize[1] * 8) + ((mb_x >> 1) * 8);        for(j = 0;j < 6; j++) {            idct_put = s->idct_put[mb->dct_mode];            if (j < 4) {                if (s->sampling_411 && mb_x < (704 / 8)) {                    /* NOTE: at end of line, the macroblock is handled as 420 */                    idct_put(y_ptr + (j * 8), s->linesize[0], block);                } else {                    idct_put(y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->linesize[0]),                             s->linesize[0], block);                }            } else {                if (s->sampling_411 && mb_x >= (704 / 8)) {                    uint8_t pixels[64], *c_ptr, *c_ptr1, *ptr;                    int y, linesize;                    /* NOTE: at end of line, the macroblock is handled as 420 */                    idct_put(pixels, 8, block);                    linesize = s->linesize[6 - j];                    c_ptr = s->current_picture[6 - j] + c_offset;                    ptr = pixels;                    for(y = 0;y < 8; y++) {                        /* convert to 411P */                        c_ptr1 = c_ptr + linesize;                        c_ptr1[0] = c_ptr[0] = (ptr[0] + ptr[1]) >> 1;                        c_ptr1[1] = c_ptr[1] = (ptr[2] + ptr[3]) >> 1;                        c_ptr1[2] = c_ptr[2] = (ptr[4] + ptr[5]) >> 1;                        c_ptr1[3] = c_ptr[3] = (ptr[6] + ptr[7]) >> 1;                        c_ptr += linesize * 2;                        ptr += 8;                    }                } else {                    /* don't ask me why they inverted Cb and Cr ! */                    idct_put(s->current_picture[6 - j] + c_offset,                              s->linesize[6 - j], block);                }            }            block += 64;            mb++;        }    }}/* NOTE: exactly one frame must be given (120000 bytes for NTSC,   144000 bytes for PAL) */static int dvvideo_decode_frame(AVCodecContext *avctx,                                  void *data, int *data_size,                                 UINT8 *buf, int buf_size){    DVVideoDecodeContext *s = avctx->priv_data;    int sct, dsf, apt, ds, nb_dif_segs, vs, width, height, i, packet_size;    unsigned size;    UINT8 *buf_ptr;    const UINT16 *mb_pos_ptr;    AVPicture *picture;        /* parse id */    init_get_bits(&s->gb, buf, buf_size);    sct = get_bits(&s->gb, 3);    if (sct != 0)        return -1;    skip_bits(&s->gb, 5);    get_bits(&s->gb, 4); /* dsn (sequence number */    get_bits(&s->gb, 1); /* fsc (channel number) */    skip_bits(&s->gb, 3);    get_bits(&s->gb, 8); /* dbn (diff block number 0-134) */    dsf = get_bits(&s->gb, 1); /* 0 = NTSC 1 = PAL */    if (get_bits(&s->gb, 1) != 0)        return -1;    skip_bits(&s->gb, 11);    apt = get_bits(&s->gb, 3); /* apt */    get_bits(&s->gb, 1); /* tf1 */    skip_bits(&s->gb, 4);    get_bits(&s->gb, 3); /* ap1 */    get_bits(&s->gb, 1); /* tf2 */    skip_bits(&s->gb, 4);    get_bits(&s->gb, 3); /* ap2 */    get_bits(&s->gb, 1); /* tf3 */    skip_bits(&s->gb, 4);    get_bits(&s->gb, 3); /* ap3 */        /* init size */    width = 720;    if (dsf) {        avctx->frame_rate = 25 * FRAME_RATE_BASE;        packet_size = PAL_FRAME_SIZE;        height = 576;        nb_dif_segs = 12;    } else {        avctx->frame_rate = 30 * FRAME_RATE_BASE;        packet_size = NTSC_FRAME_SIZE;        height = 480;        nb_dif_segs = 10;    }    /* NOTE: we only accept several full frames */    if (buf_size < packet_size)        return -1;        /* XXX: is it correct to assume that 420 is always used in PAL       mode ? */    s->sampling_411 = !dsf;    if (s->sampling_411) {        mb_pos_ptr = dv_place_411;        avctx->pix_fmt = PIX_FMT_YUV411P;    } else {        mb_pos_ptr = dv_place_420;        avctx->pix_fmt = PIX_FMT_YUV420P;    }    avctx->width = width;    avctx->height = height;    if (avctx->flags & CODEC_FLAG_DR1)    {	s->width = -1;	avctx->dr_buffer[0] = avctx->dr_buffer[1] = avctx->dr_buffer[2] = 0;	if(avctx->get_buffer_callback(avctx, width, height, I_TYPE) < 0	   && avctx->flags & CODEC_FLAG_DR1) {	    fprintf(stderr, "get_buffer() failed\n");	    return -1;	}    }    /* (re)alloc picture if needed */    if (s->width != width || s->height != height) {	if (!(avctx->flags & CODEC_FLAG_DR1))	    for(i=0;i<3;i++) {		if (avctx->dr_buffer[i] != s->current_picture[i])		    av_freep(&s->current_picture[i]);		avctx->dr_buffer[i] = 0;	    }        for(i=0;i<3;i++) {	    if (avctx->dr_buffer[i]) {		s->current_picture[i] = avctx->dr_buffer[i];		s->linesize[i] = (i == 0) ? avctx->dr_stride : avctx->dr_uvstride;	    } else {		size = width * height;		s->linesize[i] = width;		if (i >= 1) {		    size >>= 2;		    s->linesize[i] >>= s->sampling_411 ? 2 : 1;		}		s->current_picture[i] = av_malloc(size);	    }            if (!s->current_picture[i])                return -1;        }        s->width = width;        s->height = height;    }    /* for each DIF segment */    buf_ptr = buf;    for (ds = 0; ds < nb_dif_segs; ds++) {        buf_ptr += 6 * 80; /* skip DIF segment header */                for(vs = 0; vs < 27; vs++) {            if ((vs % 3) == 0) {                /* skip audio block */                buf_ptr += 80;            }            dv_decode_video_segment(s, buf_ptr, mb_pos_ptr);            buf_ptr += 5 * 80;            mb_pos_ptr += 5;        }    }    emms_c();    /* return image */    *data_size = sizeof(AVPicture);    picture = data;    for(i=0;i<3;i++) {        picture->data[i] = s->current_picture[i];        picture->linesize[i] = s->linesize[i];    }    return packet_size;}static int dvvideo_decode_end(AVCodecContext *avctx){    DVVideoDecodeContext *s = avctx->priv_data;    int i;    for(i=0;i<3;i++)	if (avctx->dr_buffer[i] != s->current_picture[i])        av_freep(&s->current_picture[i]);    return 0;}AVCodec dvvideo_decoder = {    "dvvideo",    CODEC_TYPE_VIDEO,    CODEC_ID_DVVIDEO,    sizeof(DVVideoDecodeContext),    dvvideo_decode_init,    NULL,    dvvideo_decode_end,    dvvideo_decode_frame,    CODEC_CAP_DR1,    NULL};typedef struct DVAudioDecodeContext {    AVCodecContext *avctx;    GetBitContext gb;} DVAudioDecodeContext;static int dvaudio_decode_init(AVCodecContext *avctx){    //    DVAudioDecodeContext *s = avctx->priv_data;    return 0;}/* NOTE: exactly one frame must be given (120000 bytes for NTSC,   144000 bytes for PAL) */static int dvaudio_decode_frame(AVCodecContext *avctx,                                  void *data, int *data_size,                                 UINT8 *buf, int buf_size){    //    DVAudioDecodeContext *s = avctx->priv_data;    return buf_size;}static int dvaudio_decode_end(AVCodecContext *avctx){    //    DVAudioDecodeContext *s = avctx->priv_data;    return 0;}AVCodec dvaudio_decoder = {    "dvaudio",    CODEC_TYPE_AUDIO,    CODEC_ID_DVAUDIO,    sizeof(DVAudioDecodeContext),    dvaudio_decode_init,    NULL,    dvaudio_decode_end,    dvaudio_decode_frame,    0,    NULL};

⌨️ 快捷键说明

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