45 int nb_tiles = bytestream2_get_le16(gb);
47 int pixels_overwritten = 0;
49 if ((avctx->
width / 4 + 1) * (avctx->
height / 4 + 1) < nb_tiles)
52 for (
int i = 0;
i < nb_tiles;
i++) {
53 int y = bytestream2_get_byte(gb);
54 int x = bytestream2_get_byte(gb);
55 uint16_t
mask = bytestream2_get_le16(gb);
56 int start_y = y * 4, start_x = x * 4;
57 int end_y = start_y + 4, end_x = start_x + 4;
59 for (
int j = start_y; j < end_y; j++) {
60 for (
int k = start_x; k < end_x; k++) {
67 pixels_overwritten ++;
73 return pixels_overwritten;
81 const int step_h = tile_height / 4;
82 const int step_w = tile_width / 4;
83 int nb_tiles = bytestream2_get_le16(gb);
85 int pixels_overwritten = 0;
87 if ((avctx->
width / tile_width + 1) * (avctx->
height / tile_height + 1) < nb_tiles)
90 for (
int i = 0;
i < nb_tiles;
i++) {
91 int y = bytestream2_get_byte(gb);
92 int x = bytestream2_get_byte(gb);
93 uint16_t
mask = bytestream2_get_le16(gb);
94 int start_y = y * tile_height, start_x = x * tile_width;
95 int end_y = start_y + tile_height, end_x = start_x + tile_width;
97 if (start_x >= avctx->
width || start_y >= avctx->
height)
100 for (
int j = start_y; j < end_y; j += step_h) {
101 for (
int k = start_x; k < end_x; k += step_w) {
102 if (mask & 0x8000U) {
103 for (
int m = 0; m < step_h; m++) {
104 for (
int n = 0; n < step_w; n++) {
105 if (j + m >= avctx->
height || k + n >= avctx->
width)
116 return pixels_overwritten;
124 int ret, nb_segments;
127 if (avpkt->
size < 10)
132 nb_segments = bytestream2_get_le16(&s->
gb);
133 if (nb_segments == 0)
148 for (
int i = 0;
i < nb_segments;
i++) {
155 fill = bytestream2_get_byte(&s->
gb) << 16;
157 fill |= bytestream2_get_byte(&s->
gb) << 8;
159 fill |= bytestream2_get_byte(&s->
gb) << 0;
161 resolution_flag = bytestream2_get_byte(&s->
gb);
163 if (resolution_flag & 0x10)
164 prev_pixels -=
fill_tileX(avctx, 1024, 1024, fill, frame);
165 if (resolution_flag & 0x08)
166 prev_pixels -=
fill_tileX(avctx, 256, 256, fill, frame);
167 if (resolution_flag & 0x04)
168 prev_pixels -=
fill_tileX(avctx, 64, 64, fill, frame);
169 if (resolution_flag & 0x02)
170 prev_pixels -=
fill_tileX(avctx, 16, 16, fill, frame);
171 if (resolution_flag & 0x01)
172 prev_pixels -=
fill_tile4(avctx, fill, frame);
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
static void flush(AVCodecContext *avctx)
packed RGB 8:8:8, 24bpp, RGBRGB...
Memory handling functions.
static av_cold int init(AVCodecContext *avctx)
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 void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
static void decode_flush(AVCodecContext *avctx)
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
#define i(width, name, range_min, range_max)
static int fill_tile4(AVCodecContext *avctx, int color, AVFrame *frame)
static const uint16_t mask[17]
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 fill_tileX(AVCodecContext *avctx, int tile_width, int tile_height, int color, AVFrame *frame)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
const char * name
Name of the codec implementation.
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
common internal API header
static av_cold int decode_close(AVCodecContext *avctx)
enum AVPictureType pict_type
Picture type of the frame.
int width
picture width / height.
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static av_cold int decode_init(AVCodecContext *avctx)
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.
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
int key_frame
1 -> keyframe, 0-> not
This structure stores compressed data.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.