45 #define BITMAPINFOHEADER_SIZE 0x28    46 #define TDSF_HEADER_SIZE      0x56    47 #define TDSB_HEADER_SIZE      0x08   138 #define APPLY_ALPHA(src, new, alpha) \   139     src = (src * (256 - alpha) + new * alpha) >> 8   155     if (x + w > ctx->
width)
   174     for (j = 0; j < 
h; j++) {
   175         for (i = 0; i < 
w; i++) {
   177             APPLY_ALPHA(dst[i * 3 + 0], cursor[i * 4 + 1], alpha);
   178             APPLY_ALPHA(dst[i * 3 + 1], cursor[i * 4 + 2], alpha);
   179             APPLY_ALPHA(dst[i * 3 + 2], cursor[i * 4 + 3], alpha);
   190     int i, j, k, ret, bits, cursor_fmt;
   199     cursor_fmt = bytestream2_get_le32(&ctx->
gbc);
   203                "Invalid cursor position (%d.%d outside %dx%d).\n",
   210                "Invalid cursor dimensions %dx%d.\n",
   230     switch (cursor_fmt) {
   232         for (j = 0; j < ctx->
cursor_h; j++) {
   233             for (i = 0; i < ctx->
cursor_w; i += 32) {
   234                 bits = bytestream2_get_be32(&ctx->
gbc);
   235                 for (k = 0; k < 32; k++) {
   236                     dst[0] = !!(bits & 0x80000000);
   245         for (j = 0; j < ctx->
cursor_h; j++) {
   246             for (i = 0; i < ctx->
cursor_w; i += 32) {
   247                 bits = bytestream2_get_be32(&ctx->
gbc);
   248                 for (k = 0; k < 32; k++) {
   249                     int mask_bit = !!(bits & 0x80000000);
   250                     switch (dst[0] * 2 + mask_bit) {
   281         if (cursor_fmt & 8) { 
   282             for (j = 0; j < ctx->
cursor_h; j++) {
   283                 for (i = 0; i < ctx->
cursor_w; i++) {
   284                     int val = bytestream2_get_be32(&ctx->
gbc);
   293             for (j = 0; j < ctx->
cursor_h; j++) {
   294                 for (i = 0; i < ctx->
cursor_w; i++) {
   295                     int val = bytestream2_get_be32(&ctx->
gbc);
   316     out[0] = av_clip_uint8(Y + (             91881 * V + 32768 >> 16));
   317     out[1] = av_clip_uint8(Y + (-22554 * U - 46802 * V + 32768 >> 16));
   318     out[2] = av_clip_uint8(Y + (116130 * U             + 32768 >> 16));
   323                                        const uint8_t *srcy, 
int srcy_stride,
   328     for (line = 0; line < 
height; line++) {
   329         for (col = 0; col < 
width; col++)
   331                          srcu[col >> 1] - 128, srcv[col >> 1] - 128);
   335         srcu += srcuv_stride * (line & 1);
   336         srcv += srcuv_stride * (line & 1);
   342                                  int x, 
int y, 
int w, 
int h)
   351     jpkt.
size = tile_size;
   362                "JPEG decoding error (%d).\n", ret);
   390     for (i = 0; i < number_tiles; i++) {
   397             bytestream2_get_le32(&ctx->
gbc) != 
MKTAG(
'T',
'D',
'S',
'B') ||
   403         tile_size = bytestream2_get_le32(&ctx->
gbc);
   407         tile_mode = bytestream2_get_le32(&ctx->
gbc);
   409         x = bytestream2_get_le32(&ctx->
gbc);
   410         y = bytestream2_get_le32(&ctx->
gbc);
   411         w = bytestream2_get_le32(&ctx->
gbc) - x;
   412         h = bytestream2_get_le32(&ctx->
gbc) - y;
   416                    "Invalid tile position (%d.%d outside %dx%d).\n",
   422                    "Invalid tile size %dx%d\n", w, h);
   432         if (tile_mode == 
MKTAG(
'G',
'E',
'P',
'J')) {
   437         } 
else if (tile_mode == 
MKTAG(
' ',
'W',
'A',
'R')) {
   464     w =  bytestream2_get_le32(&ctx->
gbc);
   465     h = -bytestream2_get_le32(&ctx->
gbc);
   467     if (bytestream2_get_le16(&ctx->
gbc) != 1 ||  
   468         bytestream2_get_le16(&ctx->
gbc) != 24)   
   500     int action = bytestream2_get_le32(&ctx->
gbc);
   504     if (action == 2 || action == 3) {
   528     int ret, tag_header, keyframe = 0;
   556     tag_header = bytestream2_get_le32(&ctx->
gbc);
   558     if (tag_header == 
MKTAG(
'T',
'D',
'S',
'F')) {
   565         number_tiles = bytestream2_get_le32(&ctx->
gbc);
   568         keyframe = bytestream2_get_le32(&ctx->
gbc) == 0x30;
   576             tag_header = bytestream2_get_le32(&ctx->
gbc);
   580     if (tag_header == 
MKTAG(
'D',
'T',
'S',
'M')) {
   582         int tag_size = bytestream2_get_le32(&ctx->
gbc);
 #define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
const char const char void * val
#define AVERROR_INVALIDDATA
Invalid data found when processing input. 
static int tdsc_decode_tiles(AVCodecContext *avctx, int number_tiles)
static float alpha(float a)
This structure describes decoded (raw) audio or video data. 
int dct_algo
DCT algorithm, see FF_DCT_* below. 
#define AV_LOG_WARNING
Something somehow does not look correct. 
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context. 
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx. 
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
static av_cold int tdsc_init(AVCodecContext *avctx)
AVCodecContext * jpeg_avctx
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature. 
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values. 
#define BITMAPINFOHEADER_SIZE
static int tdsc_parse_dtsm(AVCodecContext *avctx)
static av_always_inline void tdsc_blit(uint8_t *dst, int dst_stride, const uint8_t *srcy, int srcy_stride, const uint8_t *srcu, const uint8_t *srcv, int srcuv_stride, int width, int height)
static av_cold int tdsc_close(AVCodecContext *avctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
int ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Call avcodec_open2 recursively by decrementing counter, unlocking mutex, calling the function and the...
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g. 
static int tdsc_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Return decoded output data from a decoder. 
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers. 
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
int flags
AV_CODEC_FLAG_*. 
const char * name
Name of the codec implementation. 
static int tdsc_parse_tdsf(AVCodecContext *avctx, int number_tiles)
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst. 
enum AVPictureType pict_type
Picture type of the frame. 
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors. 
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values. 
int width
picture width / height. 
int idct_algo
IDCT algorithm, see FF_IDCT_* below. 
static int tdsc_decode_jpeg_tile(AVCodecContext *avctx, int tile_size, int x, int y, int w, int h)
#define AV_EF_EXPLODE
abort decoding on minor error detection 
packed RGB 8:8:8, 24bpp, BGRBGR... 
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome. 
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
Supply raw packet data as input to a decoder. 
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer. 
static void tdsc_paint_cursor(AVCodecContext *avctx, uint8_t *dst, int stride)
Libavcodec external API header. 
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer...
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line. 
main external API structure. 
AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID. 
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame. 
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2. 
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data. 
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields. 
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes. 
common internal api header. 
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values. 
#define AVERROR_UNKNOWN
Unknown error, typically from an external library. 
int key_frame
1 -> keyframe, 0-> not 
#define APPLY_ALPHA(src, new, alpha)
static void tdsc_yuv2rgb(uint8_t *out, int Y, int U, int V)
int flags2
AV_CODEC_FLAG2_*. 
static int tdsc_load_cursor(AVCodecContext *avctx)
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst. 
#define MKTAG(a, b, c, d)
This structure stores compressed data. 
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.