Mercurial > libavcodec.hg
changeset 382:b1663b0ffbbc libavcodec
* first shot for the new avcodec API
- comments, critics, improvements on the ffmpeg list are welcomed
author | kabi |
---|---|
date | Tue, 14 May 2002 14:17:11 +0000 |
parents | 0d6178e4d503 |
children | e6b64bc3bc87 |
files | avcodec.c avcodec.h |
diffstat | 2 files changed, 227 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/avcodec.c Tue May 14 14:17:11 2002 +0000 @@ -0,0 +1,150 @@ +#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 +{ + AVCodec* avcodec; + AVCodecContext avcontext; +} private_handle_t; + +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_MSMPEG4, { 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_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() +{ + private_handle_t* t = malloc(sizeof(private_handle_t)); + if (!t) + return NULL; + + // register and fill + avcodec_init(); + avcodec_register_all(); + return t; +} + +static void destroy_handle(private_handle_t* handle) +{ + if (handle) + { + if (handle->avcodec) + { + avcodec_close(&handle->avcontext); + } + 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* handle = create_handle(); + (private_handle_t**)pout = handle; + if (!handle) + return -ENOMEM; + if (!handle->avcodec) + { + destroy_handle(handle); + (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* handle = create_handle(); + (private_handle_t**)pout = handle; + if (!handle) + return -ENOMEM; + + if (!handle->avcodec) + { + destroy_handle(handle); + (private_handle_t**)pout = NULL; + return -1;// better error + } + return 0; + } + case AVC_OPEN_BY_FOURCC: + { + // pin uint32_t codec fourcc + private_handle_t* handle = create_handle(); + (private_handle_t**)pout = handle; + if (!handle) + return -ENOMEM; + handle->avcodec = avcodec_find_by_fcc((uint32_t) pin); + if (!handle->avcodec) + { + destroy_handle(handle); + (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; +}
--- a/avcodec.h Tue May 14 02:36:23 2002 +0000 +++ b/avcodec.h Tue May 14 14:17:11 2002 +0000 @@ -426,4 +426,81 @@ extern int quant_store[MBR+1][MBC+1]; // [Review] #endif + +/** + * 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); + #endif /* AVCODEC_H */