Go to the documentation of this file.
54 #define PREAMBLE_SIZE 4096
67 for (
i = 0;
i < 2;
i++) {
68 for (j = 0; j < 256; j++) {
69 for (k = 0; k < 8; k++) {
70 gdv->
frame[
i * 2048 + j * 8 + k] = j;
81 for (x = 0; x <
w - 7; x+=8) {
83 dst[x + 1] =
src[(x>>1) + 0];
85 dst[x + 3] =
src[(x>>1) + 1];
87 dst[x + 5] =
src[(x>>1) + 2];
89 dst[x + 7] =
src[(x>>1) + 3];
100 for (x =
w - 1; (x+1) & 7; x--) {
103 for (x -= 7; x >= 0; x -= 8) {
105 dst[x + 7] =
src[(x>>1) + 3];
107 dst[x + 5] =
src[(x>>1) + 2];
109 dst[x + 3] =
src[(x>>1) + 1];
111 dst[x + 1] =
src[(x>>1) + 0];
118 for (x = 0; x <
w - 7; x+=8) {
119 dst[x + 0] =
src[2*x + 0];
120 dst[x + 1] =
src[2*x + 2];
121 dst[x + 2] =
src[2*x + 4];
122 dst[x + 3] =
src[2*x + 6];
123 dst[x + 4] =
src[2*x + 8];
124 dst[x + 5] =
src[2*x +10];
125 dst[x + 6] =
src[2*x +12];
126 dst[x + 7] =
src[2*x +14];
142 for (j = 0; j <
h; j++) {
150 for (j = 0; j <
h; j++) {
154 memcpy(dst1,
src1,
w);
158 if (scale_h && scale_v) {
159 for (y = 0; y < (
h>>1); y++) {
164 }
else if (scale_h) {
165 for (y = 0; y < (
h>>1); y++) {
168 memcpy(dst1,
src1,
w);
170 }
else if (scale_v) {
171 for (y = 0; y <
h; y++) {
185 if (
bits->fill == 0) {
186 bits->queue |= bytestream2_get_byte(gb);
189 res =
bits->queue >> 6;
198 bits->queue = bytestream2_get_le32(gb);
204 int res =
bits->queue & ((1 << nbits) - 1);
206 bits->queue >>= nbits;
208 if (
bits->fill <= 16) {
209 bits->queue |= bytestream2_get_le16(gb) <<
bits->fill;
224 c = bytestream2_get_byte(g2);
225 for (
i = 0;
i <
len;
i++) {
226 bytestream2_put_byte(pb,
c);
232 for (
i = 0;
i <
len;
i++) {
233 bytestream2_put_byte(pb, bytestream2_get_byte(g2));
239 for (
i = 0;
i <
len;
i++) {
240 bytestream2_put_byte(pb, bytestream2_get_byte(g2));
257 for (
c = 0;
c < 256;
c++) {
258 for (
i = 0;
i < 16;
i++) {
266 bytestream2_put_byte(pb, bytestream2_get_byte(gb));
267 }
else if (
tag == 1) {
268 int b = bytestream2_get_byte(gb);
269 int len = (
b & 0xF) + 3;
270 int top = (
b >> 4) & 0xF;
271 int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
273 }
else if (
tag == 2) {
274 int len = (bytestream2_get_byte(gb)) + 2;
303 bytestream2_put_byte(pb, bytestream2_get_byte(gb));
304 }
else if (
tag == 1) {
305 int b = bytestream2_get_byte(gb);
306 int len = (
b & 0xF) + 3;
308 int off = (bytestream2_get_byte(gb) << 4) + top - 4096;
310 }
else if (
tag == 2) {
312 int b = bytestream2_get_byte(gb);
319 len = bytestream2_get_le16(gb);
323 int b = bytestream2_get_byte(gb);
324 int len = (
b & 0x3) + 2;
325 int off = -(
b >> 2) - 1;
351 bytestream2_put_byte(pb, bytestream2_get_byte(gb));
361 if (
val != ((1 << lbits) - 1)) {
367 for (
i = 0;
i <
len;
i++) {
368 bytestream2_put_byte(pb, bytestream2_get_byte(gb));
371 }
else if (
tag == 1) {
378 int bb = bytestream2_get_byte(gb);
379 if ((bb & 0x80) == 0) {
382 int top = (bb & 0x7F) << 8;
383 len = top + bytestream2_get_byte(gb) + 146;
387 }
else if (
tag == 2) {
392 int offs = top + bytestream2_get_byte(gb);
393 if ((subtag != 0) || (offs <= 0xF80)) {
394 int len = (subtag) + 3;
403 real_off = ((offs >> 4) & 0x7) + 1;
404 len = ((offs & 0xF) + 2) * 2;
407 for (
i = 0;
i <
len/2;
i++) {
408 bytestream2_put_byte(pb,
c1);
409 bytestream2_put_byte(pb,
c2);
413 int b = bytestream2_get_byte(gb);
414 int off = ((
b & 0x7F)) + 1;
415 int len = ((
b & 0x80) == 0) ? 2 : 3;
423 int q,
b = bytestream2_get_byte(gb);
424 if ((
b & 0xC0) == 0xC0) {
425 len = ((
b & 0x3F)) + 8;
427 off = (q << 8) + (bytestream2_get_byte(gb)) + 1;
430 if ((
b & 0x80) == 0) {
431 len = ((
b >> 4)) + 6;
434 len = ((
b & 0x3F)) + 14;
437 off = (ofs1 << 8) + (bytestream2_get_byte(gb)) - 4096;
440 int ofs1,
b = bytestream2_get_byte(gb);
442 if ((
b >> 4) == 0xF) {
443 len = bytestream2_get_byte(gb) + 21;
448 off = (ofs1 << 8) + bytestream2_get_byte(gb) - 4096;
474 flags = bytestream2_get_le32(gb);
475 compression =
flags & 0xF;
477 if (compression == 4 || compression == 7 || compression > 8)
489 switch (compression) {
494 for (
i = 0;
i < 256;
i++) {
495 unsigned r = bytestream2_get_byte(gb);
496 unsigned g = bytestream2_get_byte(gb);
497 unsigned b = bytestream2_get_byte(gb);
498 gdv->
pal[
i] = 0xFF
U << 24 |
r << 18 |
g << 10 |
b << 2;
528 for (y = 0; y < avctx->
height; y++) {
530 sidx += avctx->
width;
531 didx +=
frame->linesize[0];
537 for (y = 0; y < avctx->
height; y++) {
541 uint8_t *dst2 =
dst + didx;
546 if (!gdv->
scale_h || ((y & 1) == 1)) {
549 didx +=
frame->linesize[0];
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
static int decompress_2(AVCodecContext *avctx)
This structure describes decoded (raw) audio or video data.
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
static int decompress_68(AVCodecContext *avctx, unsigned skip, unsigned use8)
static av_cold void close(AVCodecParserContext *s)
AVCodec p
The public AVCodec.
static double val(void *priv, double ch)
static int gdv_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
static void scaleup(uint8_t *dst, const uint8_t *src, int w)
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
#define FF_CODEC_DECODE_CB(func)
static int read_bits2(Bits8 *bits, GetByteContext *gb)
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static av_cold int gdv_decode_init(AVCodecContext *avctx)
static void lz_copy(PutByteContext *pb, GetByteContext *g2, int offset, unsigned len)
#define CODEC_LONG_NAME(str)
static av_always_inline int bytestream2_get_bytes_left_p(const PutByteContext *p)
static av_cold int gdv_decode_close(AVCodecContext *avctx)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
static void rescale(GDVContext *gdv, uint8_t *dst, int w, int h, int scale_v, int scale_h)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
#define i(width, name, range_min, range_max)
static void fill_bits32(Bits32 *bits, GetByteContext *gb)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
static void scaledown(uint8_t *dst, const uint8_t *src, int w)
static av_always_inline void bytestream2_skip_p(PutByteContext *p, unsigned int size)
const FFCodec ff_gdv_decoder
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void * av_calloc(size_t nmemb, size_t size)
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static void scaleup_rev(uint8_t *dst, const uint8_t *src, int w)
main external API structure.
static int decompress_5(AVCodecContext *avctx, unsigned skip)
This structure stores compressed data.
int width
picture width / height.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
Check whether the side-data of src contains a palette of size AVPALETTE_SIZE; if so,...
static int read_bits32(Bits32 *bits, GetByteContext *gb, int nbits)
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.