+
+/*****************************************************************************
+ * GetCc: Retrieves the Closed Captions for the CC decoder.
+ *****************************************************************************/
+static block_t *GetCc( decoder_t *p_dec, bool pb_present[4] )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+ block_t *p_cc = NULL;
+ int i;
+
+ for( i = 0; i < 4; i++ )
+ pb_present[i] = p_sys->cc.pb_present[i];
+
+ if( p_sys->cc.i_data <= 0 )
+ return NULL;
+
+ p_cc = block_New( p_dec, p_sys->cc.i_data);
+ if( p_cc )
+ {
+ memcpy( p_cc->p_buffer, p_sys->cc.p_data, p_sys->cc.i_data );
+ p_cc->i_dts =
+ p_cc->i_pts = p_sys->cc.b_reorder ? p_sys->i_cc_pts : p_sys->i_cc_dts;
+ p_cc->i_flags = ( p_sys->cc.b_reorder ? p_sys->i_cc_flags : BLOCK_FLAG_TYPE_P ) & ( BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B);
+ }
+ cc_Flush( &p_sys->cc );
+ return p_cc;
+}
+
+/*****************************************************************************
+ * GetAR: Get aspect ratio
+ *****************************************************************************/
+static void GetAR( decoder_t *p_dec )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ /* Check whether the input gave a particular aspect ratio */
+ if( p_dec->fmt_in.video.i_aspect )
+ {
+ p_sys->i_aspect = p_dec->fmt_in.video.i_aspect;
+ }
+ else
+ {
+ /* Use the value provided in the MPEG sequence header */
+ if( p_sys->p_info->sequence->pixel_height > 0 )
+ {
+ p_sys->i_aspect =
+ ((uint64_t)p_sys->p_info->sequence->picture_width) *
+ p_sys->p_info->sequence->pixel_width *
+ VOUT_ASPECT_FACTOR /
+ p_sys->p_info->sequence->picture_height /
+ p_sys->p_info->sequence->pixel_height;
+ p_sys->i_sar_num = p_sys->p_info->sequence->pixel_width;
+ p_sys->i_sar_den = p_sys->p_info->sequence->pixel_height;
+ }
+ else
+ {
+ /* Invalid aspect, assume 4:3.
+ * This shouldn't happen and if it does it is a bug
+ * in libmpeg2 (likely triggered by an invalid stream) */
+ p_sys->i_aspect = VOUT_ASPECT_FACTOR * 4 / 3;
+ p_sys->i_sar_num = p_sys->p_info->sequence->picture_height * 4;
+ p_sys->i_sar_den = p_sys->p_info->sequence->picture_width * 3;
+ }
+ }
+
+ msg_Dbg( p_dec, "%dx%d (display %d,%d), aspect %d, sar %i:%i, %u.%03u fps",
+ p_sys->p_info->sequence->picture_width,
+ p_sys->p_info->sequence->picture_height,
+ p_sys->p_info->sequence->display_width,
+ p_sys->p_info->sequence->display_height,
+ p_sys->i_aspect, p_sys->i_sar_num, p_sys->i_sar_den,
+ (uint32_t)((uint64_t)1001000000 * 27 /
+ p_sys->p_info->sequence->frame_period / 1001),
+ (uint32_t)((uint64_t)1001000000 * 27 /
+ p_sys->p_info->sequence->frame_period % 1001) );
+}