/*=============================================================================
FUNCTION:           updateSubFrame2VideoSurface

DESCRIPTION:        This function updata a subframe to video surface.
==============================================================================*/
VSFlowReturn
updateSubFrame2VideoSurface (void *vshandle, SubFrame * subframe, int idx)
{
  VideoSurface *vsurface;

  if (vshandle == NULL)
    return VS_FLOW_PARAMETER_ERROR;

  vsurface = (VideoSurface *) vshandle;
  VS_LOCK (gVSlock);

  if (subframe) {
    vsurface->subframes[idx].width = subframe->width;
    vsurface->subframes[idx].height = subframe->height;
    vsurface->subframes[idx].posx = subframe->posx;
    vsurface->subframes[idx].posy = subframe->posy;
    vsurface->subframes[idx].image = subframe->image;
    vsurface->subframes[idx].fmt = SUBFRAME_DEFAULT_FMT;
    vsurface->itask.mode = 1;


    if (vsurface->mainframeupdate) {
      _reconfigSubFrameBuffer (vsurface);
      vsurface->mainframeupdate = 0;
    }
    _updateSubFrame (vsurface);


  } else {
    vsurface->itask.mode = 0;
  }

  VS_UNLOCK (gVSlock);
  return VS_FLOW_OK;
}
VSFlowReturn 
_configMasterVideoSurface(void * vshandle, void  * config)
{
    VS_FLOW("Fun %s in\n", __FUNCTION__);
    DestinationFmt * des = (DestinationFmt *)config;

    VideoSurface * vs;
    SourceFmt src;
    vs = (VideoSurface *)vshandle;

    VS_MESSAGE("reconfig win from "WIN_FMT" to "WIN_FMT"\n", WIN_ARGS(&vs->desfmt.rect), WIN_ARGS(&des->rect));

    VideoDevice * vd=SURFACE2DEVICE(vs);

      
    VS_LOCK(gVSlock);
    vs->desfmt = *des;
    vs->outside = _adjustDestRect(&des->rect, vd);
    vs->adjustdesrect = des->rect;

    if (NEXTSURFACE(vs)){
        _removeVideoSurfaceFromDevice(vd,vs);
        _addVideoSurface2Device(vd,vs);
    }

    _clearVideoSurfaceBackground(vd, vs);
    
    if (_checkOnDevice(vd)){
        _reconfigAllVideoSurfaces(vd);
        _setDeviceConfig(vd);
    }else{
        _initVSIPUTask(vs);
    }
    if (vd->setalpha)
        _setAlpha(vd);

    vs->mainframeupdate = 1;

    if (vs->itask.mode){
        _reconfigSubFrameBuffer(vs);
        vs->mainframeupdate = 0;
        _updateSubFrame(vs);
    }

    
    _refreshOnDevice(vd);

    VS_UNLOCK(gVSlock);
    VS_FLOW("Fun %s out\n", __FUNCTION__);

    return VS_FLOW_OK;

}