int x;
int y;
int id_number;
+ int object_number;
} PGSSubPresentation;
typedef struct PGSSubPicture {
* @param buf_size size of packet to process
* @todo TODO: Implement cropping
* @todo TODO: Implement forcing of subtitles
- * @todo TODO: Blanking of subtitle
*/
static void parse_presentation_segment(AVCodecContext *avctx,
const uint8_t *buf, int buf_size)
PGSSubContext *ctx = avctx->priv_data;
int x, y;
- uint8_t block;
int w = bytestream_get_be16(&buf);
int h = bytestream_get_be16(&buf);
ctx->presentation.id_number = bytestream_get_be16(&buf);
- /* Next byte is the state. */
- block = bytestream_get_byte(&buf);;
- if (block == 0x80) {
/*
- * Skip 7 bytes of unknown:
+ * Skip 3 bytes of unknown:
+ * state
* palette_update_flag (0x80),
* palette_id_to_use,
- * Object Number (if > 0 determines if more data to process),
+ */
+ buf += 3;
+
+ ctx->presentation.object_number = bytestream_get_byte(&buf);
+ if (!ctx->presentation.object_number)
+ return;
+
+ /*
+ * Skip 4 bytes of unknown:
* object_id_ref (2 bytes),
* window_id_ref,
* composition_flag (0x80 - object cropped, 0x40 - object forced)
*/
- buf += 7;
+ buf += 4;
x = bytestream_get_be16(&buf);
y = bytestream_get_be16(&buf);
/* Fill in dimensions */
ctx->presentation.x = x;
ctx->presentation.y = y;
- } else if (block == 0x00) {
- /* TODO: Blank context as subtitle should not be displayed.
- * If the subtitle is blanked now the subtitle is not
- * on screen long enough to read, due to a delay in
- * initial display timing.
- */
- }
}
/**
*/
memset(sub, 0, sizeof(*sub));
+ // Blank if last object_number was 0.
+ // Note that this may be wrong for more complex subtitles.
+ if (!ctx->presentation.object_number)
+ return 1;
sub->start_display_time = 0;
sub->end_display_time = 20000;
sub->format = 0;