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

📄 avcodec.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
字号:
/** * @file avcodec.c * avcodec. */#include "errno.h"#include "avcodec.h"#ifndef MKTAG#define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))#endif// private structure used to hide all internal memory allocations// and structures used for de/encoding - end user should// never see any complicated structuretypedef struct private_handle{    AVCodec* avcodec;    AVCodecContext avcontext;    struct private_handle* next;    struct private_handle* prev;} private_handle_t;static private_handle_t* handle_first = 0;static AVCodec* avcodec_find_by_fcc(uint32_t fcc){    // translation table    static const struct fcc_to_avcodecid {	enum CodecID codec;	uint32_t list[4]; // maybe we could map more fcc to same codec    } lc[] = {	{ CODEC_ID_H263, { MKTAG('U', '2', '6', '3'), 0 } },	{ CODEC_ID_H263I, { MKTAG('I', '2', '6', '3'), 0 } },	{ CODEC_ID_MSMPEG4V3, { MKTAG('D', 'I', 'V', '3'), 0 } },	{ CODEC_ID_MPEG4, { MKTAG('D', 'I', 'V', 'X'),  MKTAG('D', 'X', '5', '0'), 0 } },	{ CODEC_ID_MSMPEG4V2, { MKTAG('M', 'P', '4', '2'), 0 } },	{ CODEC_ID_MJPEG, { MKTAG('M', 'J', 'P', 'G'), 0 } },	{ CODEC_ID_MPEG1VIDEO, { MKTAG('P', 'I', 'M', '1'), 0 } },	{ CODEC_ID_AC3, { 0x2000, 0 } },	{ CODEC_ID_MP2, { 0x50, 0x55, 0 } },	{ CODEC_ID_FLV1, { MKTAG('F', 'L', 'V', '1'), 0 } },	{ CODEC_ID_NONE, {0}}    };    const struct fcc_to_avcodecid* c;    for (c = lc; c->codec != CODEC_ID_NONE; c++)    {	int i = 0;	while (c->list[i] != 0)	    if (c->list[i++] == fcc)		return avcodec_find_decoder(c->codec);    }    return NULL;}static private_handle_t* create_handle(void){    private_handle_t* t = av_malloc(sizeof(private_handle_t));    if (!t)	return NULL;    memset(t, 0, sizeof(*t));    // register and fill    if (!handle_first)    {	avcodec_init();	avcodec_register_all();        handle_first = t;    }    else    {        t->prev = handle_first->next;	handle_first->next = t;	t->next = handle_first;    }    return t;}static void destroy_handle(private_handle_t* handle){    if (handle)    {	if (handle->avcodec)	{	    avcodec_close(&handle->avcontext);	}	av_free(handle);        // count referencies    }}int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout){    AVCodecContext* ctx = handle;    switch (cmd)    {    case AVC_OPEN_BY_NAME:	{            // pin  char* codec name	    private_handle_t* h = create_handle();	    (private_handle_t**)pout = h;	    if (!h)		return -ENOMEM;	    if (!h->avcodec)	    {		destroy_handle(h);		(private_handle_t**)pout = NULL;		return -1;// better error	    }            return 0;	}    case AVC_OPEN_BY_CODEC_ID:	{            // pin  uint32_t codec fourcc	    private_handle_t* h = create_handle();	    (private_handle_t**)pout = h;	    if (!h)		return -ENOMEM;	    if (!h->avcodec)	    {		destroy_handle(h);		(private_handle_t**)pout = NULL;		return -1;// better error	    }            return 0;	}    case AVC_OPEN_BY_FOURCC:	{            // pin  uint32_t codec fourcc	    private_handle_t* h = create_handle();	    (private_handle_t**)pout = h;	    if (!h)		return -ENOMEM;	    h->avcodec = avcodec_find_by_fcc((uint32_t) pin);	    if (!h->avcodec)	    {		destroy_handle(h);		(private_handle_t**)pout = NULL;		return -1;// better error	    }            return 0;	}    case AVC_CLOSE:	// uninit part	// eventually close all allocated space if this was last	// instance	destroy_handle(handle);	break;    case AVC_FLUSH:	break;    case AVC_DECODE:	break;    case AVC_ENCODE:	break;    case AVC_GET_VERSION:        (int*) pout = 500;    default:	return -1;    }    return 0;}

⌨️ 快捷键说明

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