35 #define CDG_FULL_WIDTH           300 
   36 #define CDG_FULL_HEIGHT          216 
   37 #define CDG_DISPLAY_WIDTH        294 
   38 #define CDG_DISPLAY_HEIGHT       204 
   39 #define CDG_BORDER_WIDTH           6 
   40 #define CDG_BORDER_HEIGHT         12 
   43 #define CDG_COMMAND             0x09 
   47 #define CDG_INST_MEMORY_PRESET     1 
   48 #define CDG_INST_BORDER_PRESET     2 
   49 #define CDG_INST_TILE_BLOCK        6 
   50 #define CDG_INST_SCROLL_PRESET    20 
   51 #define CDG_INST_SCROLL_COPY      24 
   52 #define CDG_INST_TRANSPARENT_COL  28 
   53 #define CDG_INST_LOAD_PAL_LO      30 
   54 #define CDG_INST_LOAD_PAL_HIGH    31 
   55 #define CDG_INST_TILE_BLOCK_XOR   38 
   58 #define CDG_PACKET_SIZE           24 
   59 #define CDG_DATA_SIZE             16 
   60 #define CDG_TILE_HEIGHT           12 
   61 #define CDG_TILE_WIDTH             6 
   62 #define CDG_MINIMUM_PKT_SIZE       6 
   63 #define CDG_MINIMUM_SCROLL_SIZE    3 
   64 #define CDG_HEADER_SIZE            8 
   65 #define CDG_PALETTE_SIZE          16 
   95     int color    = data[0] & 0x0F;
 
   97     if (!(data[1] & 0x0F)) {
 
  117     int array_offset  = low ? 0 : 8;
 
  120     for (i = 0; i < 8; i++) {
 
  121         color = (data[2 * i] << 6) + (data[2 * i + 1] & 0x3F);
 
  122         r = ((color >> 8) & 0x000F) * 17;
 
  123         g = ((color >> 4) & 0x000F) * 17;
 
  124         b = ((
color     ) & 0x000F) * 17;
 
  125         palette[i + array_offset] = 0xFF
U << 24 | r << 16 | g << 8 | 
b;
 
  151             if (!((data[4 + y] >> (5 - x)) & 0x01))
 
  152                 color = data[0] & 0x0F;
 
  154                 color = data[1] & 0x0F;
 
  156             ai = ci + x + (stride * (ri + y));
 
  177     in  += in_tl_x  + in_tl_y  * 
stride;
 
  178     out += out_tl_x + out_tl_y * 
stride;
 
  179     for (y = 0; y < 
h; y++)
 
  180         memcpy(out + y * stride, in + y * stride, w);
 
  188     for (y = tl_y; y < tl_y + 
h; y++)
 
  189         memset(out + tl_x + y * stride, color, w);
 
  205                        AVFrame *new_frame, 
int roll_over)
 
  208     int hscmd, h_off, hinc, vscmd, v_off, vinc;
 
  214     color =  data[0] & 0x0F;
 
  215     hscmd = (data[1] & 0x30) >> 4;
 
  216     vscmd = (data[2] & 0x30) >> 4;
 
  242         memcpy(out + 
FFMAX(0, hinc) + stride * y,
 
  243                in + 
FFMAX(0, hinc) - hinc + (y - vinc) * stride,
 
  244                FFMIN(stride + hinc, stride));
 
  249                          stride, vinc, stride, roll_over);
 
  253                          stride, -1 * vinc, stride, roll_over);
 
  270     int buf_size       = avpkt->
size;
 
  295     command = bytestream2_get_byte(&gb);
 
  296     inst    = bytestream2_get_byte(&gb);
 
  304             if (!(cdg_data[1] & 0x0F))
 
  305                 memset(cc->
frame->
data[0], cdg_data[0] & 0x0F,
 
  356         if (!frame->
data[0]) {
 
  379     .
name           = 
"cdgraphics",
 
#define CDG_BORDER_HEIGHT
This structure describes decoded (raw) audio or video data. 
#define CDG_INST_TRANSPARENT_COL
ptrdiff_t const GLvoid * data
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 cdg_border_preset(CDGraphicsContext *cc, uint8_t *data)
#define CDG_INST_LOAD_PAL_HIGH
#define CDG_INST_SCROLL_PRESET
static void cdg_fill_wrapper(int out_tl_x, int out_tl_y, uint8_t *out, int in_tl_x, int in_tl_y, uint8_t *in, int color, int w, int h, int stride, int roll)
static int cdg_tile_block(CDGraphicsContext *cc, uint8_t *data, int b)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values. 
static void cdg_copy_rect_buf(int out_tl_x, int out_tl_y, uint8_t *out, int in_tl_x, int in_tl_y, uint8_t *in, int w, int h, int stride)
8 bits with AV_PIX_FMT_RGB32 palette 
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame. 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
static av_cold int cdg_decode_init(AVCodecContext *avctx)
#define CDG_MINIMUM_PKT_SIZE
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static void cdg_fill_rect_preset(int tl_x, int tl_y, uint8_t *out, int color, int w, int h, int stride)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g. 
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
#define CDG_INST_BORDER_PRESET
static av_cold int cdg_decode_end(AVCodecContext *avctx)
#define CDG_INST_TILE_BLOCK
const char * name
Name of the codec implementation. 
#define CDG_FULL_WIDTH
default screen sizes 
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
Identical in function to av_frame_make_writable(), except it uses ff_get_buffer() to allocate the buf...
static int cdg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
int width
picture width / height. 
#define CDG_INST_MEMORY_PRESET
instruction codes 
static void cdg_scroll(CDGraphicsContext *cc, uint8_t *data, AVFrame *new_frame, int roll_over)
static void cdg_load_palette(CDGraphicsContext *cc, uint8_t *data, int low)
Libavcodec external API header. 
AVCodec ff_cdgraphics_decoder
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line. 
main external API structure. 
#define CDG_INST_LOAD_PAL_LO
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame. 
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
int palette_has_changed
Tell user application that palette has changed from previous frame. 
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. 
#define CDG_INST_TILE_BLOCK_XOR
GLint GLenum GLboolean GLsizei stride
common internal api header. 
int frame_number
Frame counter, set by libavcodec. 
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
#define CDG_INST_SCROLL_COPY
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. 
#define CDG_MINIMUM_SCROLL_SIZE