Go to the documentation of this file.
31 #define PCX_HEADER_SIZE 128
35 unsigned int bytes_per_scanline,
47 value = bytestream2_get_byte(gb);
50 value = bytestream2_get_byte(gb);
52 while (
i < bytes_per_scanline &&
run--)
66 for (
i = 0;
i < pallen;
i++)
67 *dst++ = 0xFF000000 | bytestream2_get_be24u(gb);
69 memset(dst, 0, (256 - pallen) *
sizeof(*dst));
76 int compressed, xmin, ymin, xmax, ymax;
78 unsigned int w,
h, bits_per_pixel, bytes_per_line, nplanes, y, x,
80 uint8_t *ptr, *scanline;
90 if (bytestream2_get_byteu(&gb) != 0x0a || bytestream2_get_byteu(&gb) > 5) {
95 compressed = bytestream2_get_byteu(&gb);
96 bits_per_pixel = bytestream2_get_byteu(&gb);
97 xmin = bytestream2_get_le16u(&gb);
98 ymin = bytestream2_get_le16u(&gb);
99 xmax = bytestream2_get_le16u(&gb);
100 ymax = bytestream2_get_le16u(&gb);
104 if (xmax < xmin || ymax < ymin) {
113 nplanes = bytestream2_get_byteu(&gb);
114 bytes_per_line = bytestream2_get_le16u(&gb);
115 bytes_per_scanline = nplanes * bytes_per_line;
117 if (bytes_per_scanline < (
w * bits_per_pixel * nplanes + 7) / 8 ||
123 switch ((nplanes << 8) + bits_per_pixel) {
158 if (nplanes == 3 && bits_per_pixel == 8) {
159 for (y = 0; y <
h; y++) {
164 for (x = 0; x <
w; x++) {
165 ptr[3 * x] = scanline[x];
166 ptr[3 * x + 1] = scanline[x + bytes_per_line];
167 ptr[3 * x + 2] = scanline[x + (bytes_per_line << 1)];
172 }
else if (nplanes == 1 && bits_per_pixel == 8) {
173 int palstart = avpkt->
size - 769;
175 if (avpkt->
size < 769) {
182 for (y = 0; y <
h; y++, ptr +=
stride) {
186 memcpy(ptr, scanline,
w);
193 if (bytestream2_get_byte(&gb) != 12) {
199 }
else if (nplanes == 1) {
202 for (y = 0; y <
h; y++) {
209 for (x = 0; x <
w; x++)
216 for (y = 0; y <
h; y++) {
221 for (x = 0; x <
w; x++) {
222 int m = 0x80 >> (x & 7), v = 0;
223 for (
i = nplanes - 1;
i >= 0;
i--) {
225 v += !!(scanline[
i * bytes_per_line + (x >> 3)] & m);
234 if (nplanes == 1 && bits_per_pixel == 8) {
237 }
else if (bits_per_pixel * nplanes == 1) {
240 }
else if (bits_per_pixel < 8) {
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_EF_EXPLODE
abort decoding on minor error detection
const FFCodec ff_pcx_decoder
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
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
This structure describes decoded (raw) audio or video data.
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.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVCodec p
The public AVCodec.
static void pcx_palette(GetByteContext *gb, uint32_t *dst, int pallen)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
@ AV_PICTURE_TYPE_I
Intra.
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
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.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define i(width, name, range_min, range_max)
static int pcx_rle_decode(GetByteContext *gb, uint8_t *dst, unsigned int bytes_per_scanline, int compressed)
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 default value
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
#define AV_INPUT_BUFFER_PADDING_SIZE
main external API structure.
This structure stores compressed data.
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.
static int pcx_decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.