33#define SGI_SINGLE_CHAN 2
34#define SGI_MULTI_CHAN 3
44 if (avctx->
width > 65535 || avctx->
height > 65535) {
46 "SGI does not support resolutions above 65535x65535\n",
61 bytestream2_put = bytestream2_put_byte;
63 bytestream2_put = bytestream2_put_be16;
65 for (x = 0; x <
w; x += count) {
73 bytestream2_put(pbc, count);
74 bytestream2_put(pbc,
val);
82 bytestream2_put(pbc, count + 0x80);
83 for (
i = 0;
i < count;
i++) {
85 bytestream2_put(pbc,
val);
102 int x, y, z, length, tablesize, ret,
i;
104 unsigned int bytes_per_channel, pixmax, put_be;
108 bytes_per_channel = 1;
110 put_be = HAVE_BIGENDIAN;
126 put_be = !HAVE_BIGENDIAN;
129 bytes_per_channel = 2;
135 put_be = !HAVE_BIGENDIAN;
138 bytes_per_channel = 2;
144 put_be = !HAVE_BIGENDIAN;
147 bytes_per_channel = 2;
156 tablesize = depth *
height * 4;
161 length += tablesize * 2 + depth *
height * (2 *
width + 1);
170 bytestream2_put_byte(&pbc,
s->rle);
171 bytestream2_put_byte(&pbc, bytes_per_channel);
172 bytestream2_put_be16(&pbc, dimension);
173 bytestream2_put_be16(&pbc,
width);
174 bytestream2_put_be16(&pbc,
height);
175 bytestream2_put_be16(&pbc, depth);
177 bytestream2_put_be32(&pbc, 0
L);
178 bytestream2_put_be32(&pbc, pixmax);
179 bytestream2_put_be32(&pbc, 0
L);
182 for (
i = 0;
i < 80;
i++)
183 bytestream2_put_byte(&pbc, 0
L);
186 bytestream2_put_be32(&pbc, 0
L);
189 for (
i = 0;
i < 404;
i++)
190 bytestream2_put_byte(&pbc, 0
L);
207 for (z = 0; z < depth; z++) {
208 const uint8_t *in_buf = p->data[0] + p->linesize[0] * (
height - 1) + z * bytes_per_channel;
210 for (y = 0; y <
height; y++) {
213 for (x = 0; x <
width * bytes_per_channel; x += bytes_per_channel)
214 if (bytes_per_channel == 1) {
215 encode_buf[x] = in_buf[depth * x];
216 }
else if (HAVE_BIGENDIAN ^ put_be) {
217 encode_buf[x + 1] = in_buf[depth * x];
218 encode_buf[x] = in_buf[depth * x + 1];
220 encode_buf[x] = in_buf[depth * x];
221 encode_buf[x + 1] = in_buf[depth * x + 1];
231 bytestream2_put_be32(&tablen_pcb, length);
232 in_buf -= p->linesize[0];
238 for (z = 0; z < depth; z++) {
239 const uint8_t *in_buf = p->data[0] + p->linesize[0] * (
height - 1) + z * bytes_per_channel;
241 for (y = 0; y <
height; y++) {
242 for (x = 0; x <
width * depth; x += depth)
243 if (bytes_per_channel == 1)
244 bytestream2_put_byte(&pbc, in_buf[x]);
247 bytestream2_put_be16(&pbc, ((uint16_t *)in_buf)[x]);
249 bytestream2_put_le16(&pbc, ((uint16_t *)in_buf)[x]);
251 in_buf -= p->linesize[0];
263#define OFFSET(x) offsetof(SgiContext, x)
264#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static double val(void *priv, double ch)
const FFCodec ff_sgi_encoder
static av_cold int encode_init(AVCodecContext *avctx)
Libavcodec external API header.
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
static av_always_inline void bytestream2_skip_p(PutByteContext *p, unsigned int size)
static av_always_inline int bytestream2_get_bytes_left_p(const PutByteContext *p)
#define i(width, name, range_min, range_max)
#define CODEC_PIXFMTS(...)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
static int rle(uint8_t *dst, const uint8_t *src, int compressed_size, int uncompressed_size)
static int encode_frame(OutputFile *of, OutputStream *ost, AVFrame *frame, AVPacket *pkt)
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
#define LIBAVUTIL_VERSION_INT
Macro definitions for various function/variable attributes.
Memory handling functions.
@ AV_PIX_FMT_GRAY16BE
Y , 16bpp, big-endian.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_RGB48BE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big...
@ AV_PIX_FMT_RGBA64BE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_RGBA64LE
packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is st...
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_RGB48LE
packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as lit...
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
int ff_rle_count_pixels(const uint8_t *start, int len, int bpp, int same)
Count up to 127 consecutive pixels which are either all the same or all differ from the previous and ...
#define SGI_MAGIC
SGI image file signature.
static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src, int w, int bpp)
static av_cold int encode_init(AVCodecContext *avctx)
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
static const AVClass sgi_class
Describe the class of an AVClass context structure.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.