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)
 
This structure describes decoded (raw) audio or video data. 
 
int dct_algo
DCT algorithm, see FF_DCT_* below. 
 
ptrdiff_t const GLvoid * data
 
#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. 
 
static const int16_t alpha[]
 
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. 
 
GLint GLenum GLboolean GLsizei stride
 
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.