Пример #1
0
void
MIR_SetWindowFullscreen(_THIS, SDL_Window* window,
                        SDL_VideoDisplay* display,
                        SDL_bool fullscreen)
{
    MIR_Data*   mir_data   = _this->driverdata;
    MIR_Window* mir_window = window->driverdata;
    MirSurfaceSpec* spec;
    MirSurfaceState state;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    if (fullscreen) {
        state = mir_surface_state_fullscreen;
    } else {
        state = mir_surface_state_restored;
    }

    spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection);
    MIR_mir_surface_spec_set_state(spec, state);

    MIR_mir_surface_apply_spec(mir_window->surface, spec);
    MIR_mir_surface_spec_release(spec);
}
Пример #2
0
void
MIR_RestoreWindow(_THIS, SDL_Window * window)
{
    MIR_Window* mir_window = window->driverdata;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    MIR_mir_surface_set_state(mir_window->surface, mir_surface_state_restored);
}
Пример #3
0
template <class T> int CIsoSurface<T>::GetVolumeLengths(float& fVolLengthX, float& fVolLengthY, float& fVolLengthZ)
{
	if (IsSurfaceValid()) {
		fVolLengthX = m_fCellLengthX*m_nCellsX;
		fVolLengthY = m_fCellLengthY*m_nCellsY;
		fVolLengthZ = m_fCellLengthZ*m_nCellsZ;
		return 1;
	}
	else
		return -1;
}
Пример #4
0
int CIsoSurfaceBase::GetVolumeLengths( float& fVolLengthX, float& fVolLengthY, float& fVolLengthZ )
{
    if ( IsSurfaceValid() )
    {
        fVolLengthX = m_fCellLengthX * m_nCellsX;
        fVolLengthY = m_fCellLengthY * m_nCellsY;
        fVolLengthZ = m_fCellLengthZ * m_nCellsZ;
        return 1;
    }
    else
    {
        return -1;
    }
}
Пример #5
0
void
MIR_SetWindowFullscreen(_THIS, SDL_Window* window,
                        SDL_VideoDisplay* display,
                        SDL_bool fullscreen)
{
    MIR_Window* mir_window = window->driverdata;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    if (fullscreen) {
        MIR_mir_surface_set_state(mir_window->surface, mir_surface_state_fullscreen);
    } else {
        MIR_mir_surface_set_state(mir_window->surface, mir_surface_state_restored);
    }
}
Пример #6
0
void
MIR_HideWindow(_THIS, SDL_Window* window)
{
    MIR_Data*   mir_data   = _this->driverdata;
    MIR_Window* mir_window = window->driverdata;
    MirSurfaceSpec* spec;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection);
    MIR_mir_surface_spec_set_state(spec, mir_surface_state_hidden);

    MIR_mir_surface_apply_spec(mir_window->surface, spec);
    MIR_mir_surface_spec_release(spec);
}
Пример #7
0
void
MIR_SetWindowTitle(_THIS, SDL_Window* window)
{
    MIR_Data*   mir_data   = _this->driverdata;
    MIR_Window* mir_window = window->driverdata;
    char const* title = window->title ? window->title : "";
    MirSurfaceSpec* spec;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection);
    MIR_mir_surface_spec_set_name(spec, title);

    MIR_mir_surface_apply_spec(mir_window->surface, spec);
    MIR_mir_surface_spec_release(spec);
}
Пример #8
0
void
MIR_SetWindowMaximumSize(_THIS, SDL_Window* window)
{
    MIR_Data*   mir_data   = _this->driverdata;
    MIR_Window* mir_window = window->driverdata;
    MirSurfaceSpec* spec;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection);
    MIR_mir_surface_spec_set_max_width (spec, window->max_w);
    MIR_mir_surface_spec_set_max_height(spec, window->max_h);

    MIR_mir_surface_apply_spec(mir_window->surface, spec);
    MIR_mir_surface_spec_release(spec);
}
Пример #9
0
void
MIR_SetWindowSize(_THIS, SDL_Window* window)
{
    MIR_Data*   mir_data   = _this->driverdata;
    MIR_Window* mir_window = window->driverdata;
    MirSurfaceSpec* spec;

    if (IsSurfaceValid(mir_window) < 0)
        return;

    /* You cannot set the x/y of a mir window! So only update w/h */
    spec = MIR_mir_connection_create_spec_for_changes(mir_data->connection);
    MIR_mir_surface_spec_set_width (spec, window->w);
    MIR_mir_surface_spec_set_height(spec, window->h);

    MIR_mir_surface_apply_spec(mir_window->surface, spec);
    MIR_mir_surface_spec_release(spec);
}
Пример #10
0
int CVDPAU::Decode(AVCodecContext *avctx, AVFrame *pFrame)
{
  //CLog::Log(LOGNOTICE,"%s",__FUNCTION__);
  VdpStatus vdp_st;
  VdpTime time;

  int result = Check(avctx);
  if (result)
    return result;

  CSharedLock lock(m_DecoderSection);

  if (!vdpauConfigured)
    return VC_ERROR;

  // configure vdpau output
  if (!ConfigOutputMethod(avctx, pFrame))
    return VC_FLUSHED;

  outputSurface = outputSurfaces[surfaceNum];

  CheckFeatures();

  if (( (int)outRectVid.x1 != OutWidth ) ||
      ( (int)outRectVid.y1 != OutHeight ))
  {
    outRectVid.x0 = 0;
    outRectVid.y0 = 0;
    outRectVid.x1 = OutWidth;
    outRectVid.y1 = OutHeight;
  }

  EDEINTERLACEMODE   mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode;
  EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod;
  if (method == VS_INTERLACEMETHOD_AUTO)
    method = AutoInterlaceMethod();

  if(pFrame)
  { // we have a new frame from decoder

    vdpau_render_state * render = (vdpau_render_state*)pFrame->data[2];
    if(!render) // old style ffmpeg gave data on plane 0
      render = (vdpau_render_state*)pFrame->data[0];
    if(!render)
      return VC_ERROR;

    // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid
    if (!IsSurfaceValid(render))
    {
      CLog::Log(LOGWARNING, "CVDPAU::Decode - ignoring invalid buffer");
      return VC_BUFFER;
    }

    render->state |= FF_VDPAU_STATE_USED_FOR_RENDER;

    ClearUsedForRender(&past[0]);
    past[0] = past[1];
    past[1] = current;
    current = future;
    future = render;

    DVDVideoPicture DVDPic;
    memset(&DVDPic, 0, sizeof(DVDVideoPicture));
    ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&DVDPic);
    m_DVDVideoPics.push(DVDPic);

    int pics = m_DVDVideoPics.size();
    if (pics < 2)
        return VC_BUFFER;
    else if (pics > 2)
    {
      // this should not normally happen
      CLog::Log(LOGERROR, "CVDPAU::Decode - invalid number of pictures in queue");
      while (pics-- != 2)
        m_DVDVideoPics.pop();
    }

    if (mode == VS_DEINTERLACEMODE_FORCE
    || (mode == VS_DEINTERLACEMODE_AUTO && m_DVDVideoPics.front().iFlags & DVP_FLAG_INTERLACED))
    {
      if((method == VS_INTERLACEMETHOD_VDPAU_BOB
      ||  method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL
      ||  method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF
      ||  method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL
      ||  method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF
      ||  method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE ))
      {
        if(method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF
        || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF
        || avctx->skip_frame == AVDISCARD_NONREF)
          m_mixerstep = 0;
        else
          m_mixerstep = 1;

        if(m_DVDVideoPics.front().iFlags & DVP_FLAG_TOP_FIELD_FIRST)
          m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
        else
          m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD;
      }
      else
      {
        m_mixerstep  = 0;
        m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME;
      }
    }
    else
    {
      m_mixerstep  = 0;
      m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME;
    }

  }
  else if(m_mixerstep == 1)
  { // no new frame given, output second field of old frame

    if(avctx->skip_frame == AVDISCARD_NONREF)
    {
      ClearUsedForRender(&past[1]);
      m_DVDVideoPics.pop();
      return VC_BUFFER;
    }

    m_mixerstep = 2;
    if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD)
      m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD;
    else
      m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD;
  }
  else
  {
    CLog::Log(LOGERROR, "CVDPAU::Decode - invalid mixer state reached");
    return VC_BUFFER;
  }

  VdpVideoSurface past_surfaces[2] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE };
  VdpVideoSurface futu_surfaces[1] = { VDP_INVALID_HANDLE };

  if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME)
  {
    if (past[0])
      past_surfaces[1] = past[0]->surface;
    if (past[1])
      past_surfaces[0] = past[1]->surface;
    futu_surfaces[0] = future->surface;
  }
  else
  {
    if(m_mixerstep == 1)
    { // first field
      if (past[1])
      {
        past_surfaces[1] = past[1]->surface;
        past_surfaces[0] = past[1]->surface;
      }
      futu_surfaces[0] = current->surface;
    }
    else
    { // second field
      if (past[1])
        past_surfaces[1] = past[1]->surface;
      past_surfaces[0] = current->surface;
      futu_surfaces[0] = future->surface;
    }
  }

  vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue,outputSurface,&time);

  VdpRect sourceRect = {0,0,vid_width, vid_height};

  vdp_st = vdp_video_mixer_render(videoMixer,
                                  VDP_INVALID_HANDLE,
                                  0, 
                                  m_mixerfield,
                                  2,
                                  past_surfaces,
                                  current->surface,
                                  1,
                                  futu_surfaces,
                                  &sourceRect,
                                  outputSurface,
                                  &(outRectVid),
                                  &(outRectVid),
                                  0,
                                  NULL);
  CheckStatus(vdp_st, __LINE__);

  surfaceNum++;
  if (surfaceNum >= totalAvailableOutputSurfaces) surfaceNum = 0;

  if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME)
  {
    ClearUsedForRender(&past[0]);
    return VC_BUFFER | VC_PICTURE;
  }
  else
  {
    if(m_mixerstep == 1)
      return VC_PICTURE;
    else
    {
      ClearUsedForRender(&past[1]);
      return VC_BUFFER | VC_PICTURE;
    }
  }
}