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; }
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; }