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.