| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -46,6 +46,7 @@ typedef struct PGSSubPresentation { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int x; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int y; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int id_number; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int object_number; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} PGSSubPresentation; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			typedef struct PGSSubPicture { | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -255,7 +256,6 @@ static void parse_palette_segment(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 * @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) | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -263,7 +263,6 @@ static void parse_presentation_segment(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    PGSSubContext *ctx = avctx->priv_data; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int x, y; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t block; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int w = bytestream_get_be16(&buf); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int h = bytestream_get_be16(&buf); | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -278,19 +277,25 @@ static void parse_presentation_segment(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    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); | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -308,13 +313,6 @@ static void parse_presentation_segment(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* 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. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			         */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			/** | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -345,6 +343,10 @@ static int display_end_segment(AVCodecContext *avctx, void *data, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			     */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    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; | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |