提交 d1fb157d 编写于 作者: M Michael Niedermayer

broken mess removial

Originally committed as revision 3539 to svn://svn.ffmpeg.org/ffmpeg/trunk
上级 c19e76ce
/**
* @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 structure
typedef 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_DTS, { 0x10, 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;
}
......@@ -2103,82 +2103,6 @@ int64_t av_rescale(int64_t a, int64_t b, int64_t c);
*/
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding);
/**
* Interface for 0.5.0 version
*
* do not even think about it's usage for this moment
*/
typedef struct {
/// compressed size used from given memory buffer
int size;
/// I/P/B frame type
int frame_type;
} avc_enc_result_t;
/**
* Commands
* order can't be changed - once it was defined
*/
typedef enum {
// general commands
AVC_OPEN_BY_NAME = 0xACA000,
AVC_OPEN_BY_CODEC_ID,
AVC_OPEN_BY_FOURCC,
AVC_CLOSE,
AVC_FLUSH,
// pin - struct { uint8_t* src, uint_t src_size }
// pout - struct { AVPicture* img, consumed_bytes,
AVC_DECODE,
// pin - struct { AVPicture* img, uint8_t* dest, uint_t dest_size }
// pout - uint_t used_from_dest_size
AVC_ENCODE,
// query/get video commands
AVC_GET_VERSION = 0xACB000,
AVC_GET_WIDTH,
AVC_GET_HEIGHT,
AVC_GET_DELAY,
AVC_GET_QUANT_TABLE,
// ...
// query/get audio commands
AVC_GET_FRAME_SIZE = 0xABC000,
// maybe define some simple structure which
// might be passed to the user - but they can't
// contain any codec specific parts and these
// calls are usualy necessary only few times
// set video commands
AVC_SET_WIDTH = 0xACD000,
AVC_SET_HEIGHT,
// set video encoding commands
AVC_SET_FRAME_RATE = 0xACD800,
AVC_SET_QUALITY,
AVC_SET_HURRY_UP,
// set audio commands
AVC_SET_SAMPLE_RATE = 0xACE000,
AVC_SET_CHANNELS,
} avc_cmd_t;
/**
* \param handle allocated private structure by libavcodec
* for initialization pass NULL - will be returned pout
* user is supposed to know nothing about its structure
* \param cmd type of operation to be performed
* \param pint input parameter
* \param pout output parameter
*
* \returns command status - eventually for query command it might return
* integer resulting value
*/
int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout);
/* frame parsing */
typedef struct AVCodecParserContext {
void *priv_data;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册