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

📄 vmdav.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
                        if (*pb++ == 0xFF)                            len = rle_unpack(pb, dp, len);                        else                            memcpy(&dp[ofs], pb, len);                        pb += len;                        ofs += len;                    } else {                        /* interframe pixel copy */                        memcpy(&dp[ofs], &pp[ofs], len + 1);                        ofs += len + 1;                    }                } while (ofs < frame_width);                if (ofs > frame_width) {                    printf (" VMD video: offset > width (%d > %d)\n",                        ofs, frame_width);                }                dp += s->frame.linesize[0];                pp += s->prev_frame.linesize[0];            }            break;        }    }}static int vmdvideo_decode_init(AVCodecContext *avctx){    VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data;    int i;    unsigned int *palette32;    int palette_index = 0;    unsigned char r, g, b;    unsigned char *vmd_header;    unsigned char *raw_palette;    s->avctx = avctx;    avctx->pix_fmt = PIX_FMT_PAL8;    avctx->has_b_frames = 0;    dsputil_init(&s->dsp, avctx);    /* make sure the VMD header made it */    if (s->avctx->extradata_size != VMD_HEADER_SIZE) {        printf("  VMD video: expected extradata size of %d\n",             VMD_HEADER_SIZE);        return -1;    }    vmd_header = (unsigned char *)avctx->extradata;    s->unpack_buffer = av_malloc(LE_32(&vmd_header[800]));    if (!s->unpack_buffer)        return -1;    /* load up the initial palette */    raw_palette = &vmd_header[28];    palette32 = (unsigned int *)s->palette;    for (i = 0; i < PALETTE_COUNT; i++) {        r = raw_palette[palette_index++] * 4;        g = raw_palette[palette_index++] * 4;        b = raw_palette[palette_index++] * 4;        palette32[i] = (r << 16) | (g << 8) | (b);    }    s->frame.data[0] = s->prev_frame.data[0] = NULL;    return 0;}static int vmdvideo_decode_frame(AVCodecContext *avctx,                                 void *data, int *data_size,                                 uint8_t *buf, int buf_size){    VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data;    s->buf = buf;    s->size = buf_size;    s->frame.reference = 1;    if (avctx->get_buffer(avctx, &s->frame)) {        printf ("  VMD Video: get_buffer() failed\n");        return -1;    }    vmd_decode(s);    /* make the palette available on the way out */    memcpy(s->frame.data[1], s->palette, PALETTE_COUNT * 4);    if (s->prev_frame.data[0])        avctx->release_buffer(avctx, &s->prev_frame);    /* shuffle frames */    s->prev_frame = s->frame;    *data_size = sizeof(AVFrame);    *(AVFrame*)data = s->frame;    /* report that the buffer was completely consumed */    return buf_size;}static int vmdvideo_decode_end(AVCodecContext *avctx){    VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data;    if (s->prev_frame.data[0])        avctx->release_buffer(avctx, &s->prev_frame);    av_free(s->unpack_buffer);    return 0;}/* * Audio Decoder */typedef struct VmdAudioContext {    int channels;    int bits;    int block_align;    unsigned char steps8[16];    unsigned short steps16[16];    unsigned short steps128[256];    short predictors[2];} VmdAudioContext;static int vmdaudio_decode_init(AVCodecContext *avctx){    VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data;    int i;    s->channels = avctx->channels;    s->bits = avctx->bits_per_sample;    s->block_align = avctx->block_align;printf ("  %d channels, %d bits/sample, block align = %d\n",  s->channels, s->bits, s->block_align);    /* set up the steps8 and steps16 tables */    for (i = 0; i < 8; i++) {        if (i < 4)            s->steps8[i] = i;        else            s->steps8[i] = s->steps8[i - 1] + i - 1;        if (i == 0)            s->steps16[i] = 0;        else if (i == 1)            s->steps16[i] = 4;        else if (i == 2)            s->steps16[i] = 16;        else            s->steps16[i] = 1 << (i + 4);    }    /* set up the step128 table */    s->steps128[0] = 0;    s->steps128[1] = 8;    for (i = 0x02; i <= 0x20; i++)        s->steps128[i] = (i - 1) << 4;    for (i = 0x21; i <= 0x60; i++)        s->steps128[i] = (i + 0x1F) << 3;    for (i = 0x61; i <= 0x70; i++)        s->steps128[i] = (i - 0x51) << 6;    for (i = 0x71; i <= 0x78; i++)        s->steps128[i] = (i - 0x69) << 8;    for (i = 0x79; i <= 0x7D; i++)        s->steps128[i] = (i - 0x75) << 10;    s->steps128[0x7E] = 0x3000;    s->steps128[0x7F] = 0x4000;    /* set up the negative half of each table */    for (i = 0; i < 8; i++) {        s->steps8[i + 8] = -s->steps8[i];        s->steps16[i + 8] = -s->steps16[i];    }    for (i = 0; i < 128; i++)      s->steps128[i + 128] = -s->steps128[i];    return 0;}static void vmdaudio_decode_audio(VmdAudioContext *s, unsigned char *data,    uint8_t *buf, int ratio) {}static void vmdaudio_loadsound(VmdAudioContext *s, unsigned char *data,    uint8_t *buf, int silence){    if (s->channels == 2) {        if ((s->block_align & 0x01) == 0) {            if (silence)                memset(data, 0, s->block_align * 2);            else                vmdaudio_decode_audio(s, data, buf, 1);        } else {            if (silence)                memset(data, 0, s->block_align * 2);//            else//                vmdaudio_decode_audio(s, data, buf, 1);        }    } else {    }}static int vmdaudio_decode_frame(AVCodecContext *avctx,                                 void *data, int *data_size,                                 uint8_t *buf, int buf_size){    VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data;    unsigned int sound_flags;    unsigned char *output_samples = (unsigned char *)data;    /* point to the start of the encoded data */    unsigned char *p = buf + 16;    unsigned char *p_end = buf + buf_size;    if (buf[6] == 1) {        /* the chunk contains audio */        vmdaudio_loadsound(s, output_samples, p, 0);    } else if (buf[6] == 2) {        /* the chunk contains audio and silence mixed together */        sound_flags = LE_32(p);        p += 4;        /* do something with extrabufs here? */        while (p < p_end) {            if (sound_flags & 0x01)                /* audio */                vmdaudio_loadsound(s, output_samples, p, 1);            else                /* silence */                vmdaudio_loadsound(s, output_samples, p, 0);            p += s->block_align;            output_samples += (s->block_align * s->bits / 8);            sound_flags >>= 1;        }    } else if (buf[6] == 3) {        /* silent chunk */        vmdaudio_loadsound(s, output_samples, p, 1);    }//    *datasize = ;    return buf_size;}/* * Public Data Structures */AVCodec vmdvideo_decoder = {    "vmdvideo",    CODEC_TYPE_VIDEO,    CODEC_ID_VMDVIDEO,    sizeof(VmdVideoContext),    vmdvideo_decode_init,    NULL,    vmdvideo_decode_end,    vmdvideo_decode_frame,    CODEC_CAP_DR1,};AVCodec vmdaudio_decoder = {    "vmdaudio",    CODEC_TYPE_AUDIO,    CODEC_ID_VMDAUDIO,    sizeof(VmdAudioContext),    vmdaudio_decode_init,    NULL,    NULL,    vmdaudio_decode_frame,};

⌨️ 快捷键说明

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