Name NV_video_output Name Strings WGL_NV_video_output Contact Thomas True, Nvidia, ttrue@nvidia.com Ian Williams, Nvidia, iwilliams@nvidia.com Martin Schwarzer, Nvidia, mschwarzer@nvidia.com Status Shipping since 2004 for NVIDIA Quadro SDI (Serial Digital Interface) Version Last Modified Date: February 20, 2008 Number 349 Dependencies OpenGL 1.1 is required. WGL_ARB_extension_string is required. WGL_ARB_pixel_format is required. WGL_ARB_pbuffer is required. Overview This extension permits a color and or depth buffer of a pbuffer to be used for rendering and subsequent video output. After a pbuffer has been bound to a video device, subsequent color and or depth rendering into that buffer is displayed on the video output. Issues 1. Should the new pbuffer attributes be available through GL queries? No, like other pbuffer attributes you need to query them through the window system extension. This extension does not make any changes to OpenGL. Implementation Notes 1. Any created pbuffers must be the same resolution as that specified by the state of the video output device. 2. Applications may use a single pbuffer or a collection of pbuffers to send frames/fields to a video device. In the first case, an application should block on the call to wglSendPbufferToVideoNV() to ensure synchronization. In the second caes, an application should utilize wglGetVideoInfoNV() in order to query vblank and buffer counters for synchronization. Intended Usage 1) Configure the video output device via the NVCPL API or via the control panel which uses the NVCPL API. 2) Call wglChoosePixelFormatARB and find a suitable pixel format for rendering images. WGL_DRAW_TO_PBUFFER and one of WGL_BIND_TO_VIDEO_RGB_NV, WGL_BIND_TO_VIDEO_RGBA_NV or WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV must be TRUE. The per-component pixel depth of the pbuffer must be equal to or greater than the per-component depth of the video output. 3) Create pbuffers and associated rendering contexts for each channel of video by calling wglCreatePbufferARB with one of WGL_BIND_TO_VIDEO_RGB_NV, WGL_BIND_TO_VIDEO_RGBA_NV or WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV tokens in the attribute list set to TRUE. Set the width and height for each pbuffer to match that of the intended video output device. 4) Call wglGetVideoDeviceNV to retrieve the handles for all video devices available. A video device handle is required for each video stream. 5) Call wglBindVideoImageNV to bind each pbuffer drawable to a corresponding video device handle. 6) Start transfers on each video device using the appropriate NVCPL API function call. 7) Render the current frame/field for each stream to a pbuffer. Once rendering is complete, call wglSendPbufferToVideoNV() to send each frame/field to the video device. 9) Render subsequent video frames or fields calling wglSendPbufferToVideoNV() at the completion of rendering for each frame/field. 10) Stop transfers on the video device via the appropriate NVCPL API function call. 11) Call wglReleaseVideoImageNV to unbind each pbuffer drawable from its associated video device. New Procedures and Functions DECLARE_HANDLE(HPVIDEODEV); BOOL wglGetVideoDeviceNV(HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice); BOOL wglReleaseVideoDeviceNV(HPVIDEODEV hVideoDevice); BOOL wglBindVideoImageNV (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); BOOL wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer); BOOL wglSendPbufferToVideoNV (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock); BOOL wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); New Tokens Accepted by the parameter of wglGetPixelFormatAttribivARB, wglGetPixelFormatAttribfvARB, and the and parameters of wglChoosePixelFormatARB and wglCreatePbufferARB: WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 Accepted by the parameter of wglBindVideoImageNV and wglReleaseVideoImageNV: WGL_VIDEO_OUT_COLOR_NV 0x20C3 WGL_VIDEO_OUT_ALPHA_NV 0x20C4 WGL_VIDEO_OUT_DEPTH_NV 0x20C5 WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 Accepted by the parameter of wglSendPbufferToVideoNV: WGL_VIDEO_OUT_FRAME 0x20C8 WGL_VIDEO_OUT_FIELD_1 0x20C9 WGL_VIDEO_OUT_FIELD_2 0x20CA WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation) None. Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization) None. Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment Operations and the Frame Buffer) None. Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions) None. Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State Requests) None. Additions to the WGL Specification Add to the description of in wglGetPixelFormatAttribivARB and in wglGetPixelFormatfv: WGL_BIND_TO_VIDEO_RGB_NV WGL_BIND_TO_VIDEO_RGBA_NV WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV Add new table entries to match criteria in description of wglChoosePixelFormatARB: Attribute Type Match Criteria WGL_BIND_TO_VIDEO_RGB_NV boolean exact WGL_BIND_TO_VIDEO_RGBA_NV boolean exact WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV boolean exact Add wglGetVideoDeviceNV: The command BOOL wglGetVideoDeviceNV(HDC hDC, int numDevices, HPVIDEODEV hpVideoDevice) returns an array of upto handles to the available video devices in the array . must be non-negative, and must not be NULL. It is not an error if the number of available video devices is larger that ; in that case the first device handles are returned. It is an error if is larger than the number of available video devices. The order of devices returned in is implementation dependent. if wglGetVideoDeviceNV fails, FALSE is returned. To get extended error information, call GetLastError. Possible errors are as follows: ERROR_INVALID_HANDLE is not a valid handle. ERROR_INVALID_HANDLE is NULL. ERROR_INVALID_VALUE is negative. ERROR_INVALID_OPERATION The video devices are not configured. ERROR_RESOURCE_NOT_AVAILABLE The number of video devices requested are not available. Add wglReleaseVideoDeviceNV: The command BOOL wglReleaseVideoDeviceNV(HPVIDEODEV hVideoDevice) releases all resources associated with . If wglReleaseVideoDeviceNV fails, FALSE is returned. To get extended error information, call GetLastError. Possible errors are as follows: ERROR_INVALID_HANDLE is not a valid handle. ERROR_INVALID_OPERATION The video device is not allocated. Add wglBindVideoImageNV and wglReleaseVideoImageNV: The command BOOL wglBindVideoImageNV (HPVIDEODEV hpVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); binds to for subsequent scanout where specifies that contains color, alpha or depth data. Neither nor is not a valid handle. ERROR_INVALID_DATA The pbuffer size is not correct. ERROR_INVALID_OPERATION The video device is not yet configured. The command BOOL wglReleaseVideoImageNV (HPBUFFERARB hPbuffer, int iVideoBuffer); releases from a previously bound video device. The parameter specifies that the pbuffer contains color, alpha or depth data. may not be NULL. If wglReleaseVideoImageNV fails, FALSE is returned. To get extended error information, call GetLastError. Possible errors are as follows: ERROR_INVALID_HANDLE is not a valid handle. ERROR_INVALID_DATA is not a valid value. Add wglSendPbufferToVideoNV and wglGetVideoInfoNV: The command BOOL wglSendPbufferToVideoNV (HPBUFFER hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock); indicates that rendering to the is complete and that the completed frame/field contained within is ready for scan out by the video device where specifies that contains the first field, second field, two stacked fields or a complete frame. cannot be NULL. An of WGL_VIDEO_OUT_STACKED_FIELDS_1_2 indicates that does contain field1 and field2 with field1 in the upper half of and filed2 in the lower half, while WGL_VIDEO_OUT_STACKED_FIELDS_2_1 indicates field2 in the upper half of and filed1 in the lower half. The flag specifies whether or not the call should block until scan out of the specified frame/field is complete. returns the total number of frames/fields sent to the video device. If wglSendPbufferToVideoNV fails, FALSE is returned. To get extended error information, call GetLastError. Possible errors are as follows: ERROR_INVALID_HANDLE is not a valid handle. ERROR_INVALID_DATA is not a valid value. The command BOOL wglGetVideoInfoNV (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); returns in the absolute count of vertical blanks on since transfers were started while returns the count of the current pbuffer being scanned out by . If wglGetVideoInfoNV fails, FALSE is returned. To get extended error information, call GetLastError. Possible errors include: ERROR_INVALID_HANDLE is not a valid handle. New State None Usage Examples TBD Revision History: 20 February 2008 public release