33 #define RGBA(r,g,b,a) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
92 const uint8_t *buf,
unsigned int buf_size)
94 const uint8_t *rle_bitmap_end;
95 int pixel_count, line_count;
97 rle_bitmap_end = buf + buf_size;
107 while (buf < rle_bitmap_end && line_count < sub->rects[0]->h) {
111 color = bytestream_get_byte(&buf);
115 flags = bytestream_get_byte(&buf);
118 run = (run << 8) + bytestream_get_byte(&buf);
119 color = flags & 0x80 ? bytestream_get_byte(&buf) : 0;
122 if (run > 0 && pixel_count + run <= sub->rects[0]->w * sub->
rects[0]->
h) {
123 memset(sub->
rects[0]->
pict.
data[0] + pixel_count, color, run);
130 if (pixel_count % sub->
rects[0]->
w > 0)
137 if (pixel_count < sub->rects[0]->w * sub->
rects[0]->
h) {
142 av_dlog(avctx,
"Pixel Count = %d, Area = %d\n", pixel_count, sub->
rects[0]->
w * sub->
rects[0]->
h);
159 const uint8_t *buf,
int buf_size)
163 uint8_t sequence_desc;
174 sequence_desc = bytestream_get_byte(&buf);
176 if (!(sequence_desc & 0x80)) {
193 rle_bitmap_len = bytestream_get_be24(&buf) - 2*2;
195 if (buf_size > rle_bitmap_len) {
197 "Buffer dimension %d larger than the expected RLE data %d\n",
198 buf_size, rle_bitmap_len);
203 width = bytestream_get_be16(&buf);
204 height = bytestream_get_be16(&buf);
207 if (avctx->
width < width || avctx->
height < height) {
238 const uint8_t *buf,
int buf_size)
242 const uint8_t *buf_end = buf + buf_size;
245 int y, cb, cr, alpha;
246 int r,
g,
b, r_add, g_add, b_add;
251 while (buf < buf_end) {
252 color_id = bytestream_get_byte(&buf);
253 y = bytestream_get_byte(&buf);
254 cr = bytestream_get_byte(&buf);
255 cb = bytestream_get_byte(&buf);
256 alpha = bytestream_get_byte(&buf);
261 av_dlog(avctx,
"Color %d := (%d,%d,%d,%d)\n", color_id, r, g, b, alpha);
264 ctx->
clut[color_id] =
RGBA(r,g,b,alpha);
281 const uint8_t *buf,
int buf_size)
287 int w = bytestream_get_be16(&buf);
288 int h = bytestream_get_be16(&buf);
290 av_dlog(avctx,
"Video Dimensions %dx%d\n",
320 x = bytestream_get_be16(&buf);
321 y = bytestream_get_be16(&buf);
325 av_dlog(avctx,
"Subtitle Placement x=%d, y=%d\n", x, y);
328 av_log(avctx,
AV_LOG_ERROR,
"Subtitle out of video bounds. x = %d, y = %d, video width = %d, video height = %d.\n",
354 const uint8_t *buf,
int buf_size)
365 memset(sub, 0,
sizeof(*sub));
406 const uint8_t *buf = avpkt->
data;
407 int buf_size = avpkt->
size;
409 const uint8_t *buf_end;
410 uint8_t segment_type;
414 av_dlog(avctx,
"PGS sub packet:\n");
416 for (i = 0; i < buf_size; i++) {
417 av_dlog(avctx,
"%02x ", buf[i]);
431 buf_end = buf + buf_size;
434 while (buf < buf_end) {
435 segment_type = bytestream_get_byte(&buf);
436 segment_length = bytestream_get_be16(&buf);
438 av_dlog(avctx,
"Segment Length %d, Segment Type %x\n", segment_length, segment_type);
443 switch (segment_type) {
468 segment_type, segment_length);
472 buf += segment_length;
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
enum PixelFormat pix_fmt
Pixel format, see PIX_FMT_xxx.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int linesize[AV_NUM_DATA_POINTERS]
number of bytes per line
int x
top left corner of pict, undefined when pict is not set
unsigned int rle_remaining_len
int nb_colors
number of colors in pict, undefined when pict is not set
Various defines for YUV<->RGB conversion.
AVCodec ff_pgssub_decoder
PGSSubPresentation presentation
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
int w
width of pict, undefined when pict is not set
uint8_t * data[AV_NUM_DATA_POINTERS]
static int decode(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
int h
height of pict, undefined when pict is not set
struct PGSSubPresentation PGSSubPresentation
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
static int init(AVCodecParserContext *s)
static int parse_picture_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Parse the picture segment packet.
#define YUV_TO_RGB2(r, g, b, y1)
int y
top left corner of pict, undefined when pict is not set
unsigned int rle_buffer_size
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define YUV_TO_RGB1(cb1, cr1)
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
uint32_t end_display_time
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
static void parse_presentation_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Parse the presentation segment packet.
AVPicture pict
data+linesize for the bitmap of this subtitle.
static av_cold int close_decoder(AVCodecContext *avctx)
int width
picture width / height.
struct PGSSubContext PGSSubContext
static av_cold int init_decoder(AVCodecContext *avctx)
static int display_end_segment(AVCodecContext *avctx, void *data, const uint8_t *buf, int buf_size)
Parse the display segment packet.
#define av_dlog(pctx,...)
av_dlog macros Useful to print debug messages that shouldn't get compiled in normally.
static int decode_rle(AVCodecContext *avctx, AVSubtitle *sub, const uint8_t *buf, unsigned int buf_size)
Decode the RLE data.
main external API structure.
static void close(AVCodecParserContext *s)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
A bitmap, pict will be set.
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
struct PGSSubPicture PGSSubPicture
uint32_t start_display_time
static void parse_palette_segment(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
Parse the palette segment packet.
8 bit with PIX_FMT_RGB32 palette
static const uint8_t color[]
unsigned int rle_data_len