Пример #1
0
static event_t *
dvd_media_enqueue(dvd_player_t *dp, media_queue_t *mq, media_codec_t *cw,
		  int data_type, void *data, int datalen, int rate,
		  int64_t dts, int64_t pts)
{
  media_buf_t *mb = media_buf_alloc_unlocked(dp->dp_mp, datalen);
  event_t *e;

  AVCodecContext *ctx = cw->codec_ctx;

  mb->mb_cw = media_codec_ref(cw);
  mb->mb_data_type = data_type;
  mb->mb_duration = cw->codec_ctx->ticks_per_frame * 
    1000000LL * av_q2d(ctx->time_base);
  mb->mb_aspect_override = dp->dp_aspect_override;
  mb->mb_disable_deinterlacer = 1;
  mb->mb_dts = dts;
  mb->mb_pts = pts;

  
  if(pts != AV_NOPTS_VALUE && data_type == MB_VIDEO) {
    if(dp->dp_time_pts_delta == AV_NOPTS_VALUE) {
      int64_t t = av_rescale_q(dvdnav_get_current_time(dp->dp_dvdnav),
			       mpeg_tc, AV_TIME_BASE_Q);
      dp->dp_time_pts_delta = pts - t;
    }
    mb->mb_time = pts - dp->dp_time_pts_delta;
  } else {
    mb->mb_time = AV_NOPTS_VALUE;
  }

  memcpy(mb->mb_data, data, datalen);

  do {

    if((e = mb_enqueue_with_events(dp->dp_mp, mq, mb)) == NULL) {
      mb = NULL;
      break;
    }

    e = dvd_process_event(dp, e);

  } while(e == NULL);

  if(mb != NULL)
    media_buf_free_unlocked(dp->dp_mp, mb);

  return e;
}
Пример #2
0
static event_t *
dvd_media_enqueue(dvd_player_t *dp, media_queue_t *mq, media_codec_t *cw,
		  int data_type, void *data, int datalen, int rate,
		  int64_t dts, int64_t pts)
{
  media_buf_t *mb = media_buf_alloc();
  event_t *e;

  AVCodecContext *ctx = cw->codec_ctx;

  mb->mb_cw = media_codec_ref(cw);
  mb->mb_data_type = data_type;
  mb->mb_duration = cw->codec_ctx->ticks_per_frame * 
    1000000LL * av_q2d(ctx->time_base);
  mb->mb_aspect_override = dp->dp_aspect_override;
  mb->mb_disable_deinterlacer = 1;
  mb->mb_dts = dts;
  mb->mb_pts = pts;
  //  mb->mb_time = (dvdnav_get_current_time(dp->dp_dvdnav) * 1000000) / 90000;
  mb->mb_epoch = dp->dp_epoch;
  
  mb->mb_data = malloc(datalen + FF_INPUT_BUFFER_PADDING_SIZE);
  mb->mb_size = datalen;
  memcpy(mb->mb_data, data, datalen);
  memset(mb->mb_data + datalen, 0, FF_INPUT_BUFFER_PADDING_SIZE);

  do {

    if((e = mb_enqueue_with_events(dp->dp_mp, mq, mb)) == NULL)
      break;
    
    e = dvd_process_event(dp, e);

  } while(e == NULL);

  return e;
}