Go to the documentation of this file.
   32 #define CACHED_BITSTREAM_READER !ARCH_X86_32 
   80     uint8_t *ptr, *ptr1, *ptr2;
 
   84     ptr  = picture->
data[0];
 
   85     ptr1 = picture->
data[1];
 
   86     ptr2 = picture->
data[2];
 
   90     for (
int y = 0; y < 
height; y += 2) {
 
   92         for (
int x = 0; x < 
width - 1; x++) {
 
   93             fill = bytestream2_get_byte(gb);
 
   95             *(dst++) = (fill + bytestream2_peek_byte(gb) + 1) >> 1;
 
   97         fill      = bytestream2_get_byte(gb);
 
  104         for (
int x = 0; x < 
width - 1; x++) {
 
  105             fill = bytestream2_get_byte(gb);
 
  107             *(dst++) = (fill + bytestream2_peek_byte(gb) + 1) >> 1;
 
  109         fill      = bytestream2_get_byte(gb);
 
  116         for (
int x = 0; x < (
width >> 1) - 1; x++) {
 
  117             fill = bytestream2_get_byte(gb);
 
  119             *(dst++) = (fill + bytestream2_peek_byte(gb) + 1) >> 1;
 
  121         fill      = bytestream2_get_byte(gb);
 
  128         for (
int x = 0; x < (
width >> 1) - 1; x++) {
 
  129             fill = bytestream2_get_byte(gb);
 
  131             *(dst++) = (fill + bytestream2_peek_byte(gb) + 1) >> 1;
 
  133         fill      = bytestream2_get_byte(gb);
 
  150     for (
int y = 0; y < 
height - 2; y += 2) {
 
  151         const uint8_t *
src1 = ptr;
 
  152         uint8_t *dst = ptr + linesize;
 
  153         const uint8_t *
src2 = dst + linesize;
 
  154         for (x = 0; x < 
width - 2; x += 2) {
 
  155             dst[x]     = (
src1[x] + 
src2[x] + 1) >> 1;
 
  158         dst[x] = dst[x + 1] = (
src1[x] + 
src2[x] + 1) >> 1;
 
  160         ptr += linesize << 1;
 
  164     dst = ptr + linesize;
 
  165     for (x = 0; x < 
width - 2; x += 2) {
 
  167         dst[x + 1] = (
src1[x] + 
src1[x + 2] + 1) >> 1;
 
  169     dst[x] = dst[x + 1] = 
src1[x];
 
  175     for (
int y = 
height - 2; y >= 0; y -= 2) {
 
  176         const uint8_t *
src = ptr + (y >> 1) * linesize;
 
  177         uint8_t *dst = ptr +  y * linesize;
 
  180         for (
int x = 
width - 4; x >= 0; x -= 2) {
 
  181             dst[x]     =  
src[x >> 1];
 
  182             dst[x + 1] = (
src[x >> 1] + 
src[(x >> 1) + 1] + 1) >> 1;
 
  191     int start = 
s->streampos;
 
  196     count = bytestream2_get_byte(gb) + 1;
 
  200     for (
int j = 0; j < count; j++) {
 
  201         const int bit  = bytestream2_get_byteu(gb) + 1;
 
  202         const int code = bytestream2_get_be16u(gb);
 
  203         const int sym  = bytestream2_get_byteu(gb);
 
  215                              s->bits,  
sizeof(*
s->bits),  
sizeof(*
s->bits),
 
  216                              s->codes, 
sizeof(*
s->codes), 
sizeof(*
s->codes),
 
  217                              s->syms,  
sizeof(*
s->syms),  
sizeof(*
s->syms), 0);
 
  225                                    int target_res, 
int curr_res)
 
  231     int start = 
s->streampos;
 
  233     const int scaling = target_res - curr_res;
 
  234     const uint8_t type2idx[] = { 0, 0xff, 1, 2 };
 
  254         while (shiftreg != 0xfffffe) {
 
  269         idx  = type2idx[
type];
 
  273         x2 = avctx->
width >> (scaling + !!idx);
 
  274         for (
int x = 0; x < x2; x++) {
 
  279             m = 
get_vlc2(&
g, 
s->vlc[idx].table, 
s->vlc[idx].bits, 2);
 
  288     s->streampos  = (
s->streampos + 0x6000 + 2047) & ~0x7ff;
 
  297     const uint8_t *buf = avpkt->
data;
 
  299     uint8_t *ptr, *ptr1, *ptr2;
 
  305     if (!memcmp(
"PCD_OPA", buf, 7)) {
 
  308                "reading first thumbnail only\n");
 
  309     } 
else if (avpkt->
size < 786432) {
 
  311     } 
else if (memcmp(
"PCD_IPI", buf + 0x800, 7)) {
 
  315     s->orientation = 
s->thumbnails ? buf[12] & 3 : buf[0x48] & 3;
 
  319     else if (avpkt->
size <= 788480)
 
  322         s->resolution = 
av_clip(4 - 
s->lowres, 0, 4);
 
  339     if (
s->resolution < 3) {
 
  349         for (
int y = 0; y < avctx->
height; y += 2) {
 
  373         if (
s->resolution == 4) {
 
  382         s->streampos = 0xc2000;
 
  383         for (
int n = 0; n < 3; n++) {
 
  387         s->streampos = (
s->streampos + 2047) & ~0x3ff;
 
  391         if (
s->resolution == 4) {
 
  395             for (
int n = 0; n < 3; n++) {
 
  399             s->streampos = (
s->streampos + 2047) & ~0x3ff;
 
  409         for (
int y = 0; y < avctx->
height >> 1; y++) {
 
  410             for (
int x = 0; x < avctx->
width >> 1; x++) {
 
  440     for (
int i = 0; 
i < 3; 
i++)
 
  446 #define OFFSET(x) offsetof(PhotoCDContext, x) 
  447 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM 
  450     { 
"lowres",  
"Lower the decoding resolution by a power of two",
 
  
#define AV_LOG_WARNING
Something somehow does not look correct.
 
static int get_bits_left(GetBitContext *gb)
 
enum AVColorSpace colorspace
YUV colorspace type.
 
static av_cold int photocd_decode_close(AVCodecContext *avctx)
 
static int photocd_decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
 
static int get_bits_count(const GetBitContext *s)
 
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
 
This structure describes decoded (raw) audio or video data.
 
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
 
@ AVCOL_RANGE_JPEG
Full range content.
 
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
 
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.
 
static av_noinline int decode_huff(AVCodecContext *avctx, AVFrame *frame, int target_res, int curr_res)
 
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
 
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have so the codec calls ff_thread_report set FF_CODEC_CAP_ALLOCATE_PROGRESS in FFCodec caps_internal and use ff_thread_get_buffer() to allocate frames. Otherwise decode directly into the user-supplied frames. Call ff_thread_report_progress() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
 
#define bit(string, value)
 
static void skip_bits(GetBitContext *s, int n)
 
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
 
AVCodec p
The public AVCodec.
 
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
 
enum AVDiscard skip_frame
Skip decoding for selected frames.
 
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 type
 
static av_noinline void interp_pixels(uint8_t *ptr, int linesize, int width, int height)
 
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
 
static av_noinline void interp_lines(uint8_t *ptr, int linesize, int width, int height)
 
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
 
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
 
#define FF_CODEC_DECODE_CB(func)
 
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
 
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
 
#define CODEC_LONG_NAME(str)
 
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
 
@ AVDISCARD_ALL
discard all
 
#define LIBAVUTIL_VERSION_INT
 
Describe the class of an AVClass context structure.
 
enum AVColorRange color_range
MPEG vs JPEG YUV range.
 
static av_noinline int read_hufftable(AVCodecContext *avctx, VLC *vlc)
 
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
 
const char * av_default_item_name(void *ptr)
Return the context name.
 
@ AV_PICTURE_TYPE_I
Intra.
 
static av_noinline void interp_lowres(PhotoCDContext *s, AVFrame *picture, int width, int height)
 
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
 
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
 
static const ImageInfo img_info[6]
 
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
 
static av_always_inline int bytestream2_tell(GetByteContext *g)
 
enum AVPictureType pict_type
Picture type of the frame.
 
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
 
static const AVClass photocd_class
 
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
 
int ff_vlc_init_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Build VLC decoding tables suitable for use with get_vlc2().
 
#define i(width, name, range_min, range_max)
 
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
 
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
 
const char * name
Name of the codec implementation.
 
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
 
void ff_vlc_free(VLC *vlc)
 
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
 
static const AVOption options[]
 
main external API structure.
 
static av_cold int photocd_decode_init(AVCodecContext *avctx)
 
static av_const int sign_extend(int val, unsigned bits)
 
This structure stores compressed data.
 
const FFCodec ff_photocd_decoder
 
int width
picture width / height.
 
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
 
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
 
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
 
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B