Shengquan, Thanks for the sample code. I have some follow-up questions:
1. Can I use VA_RT_FORMAT_RGB32 as the pixel format for vaCreateSurfaces? It'll be simpler since normally the 2D texture is in ARGB format. 2. Do I have to align the picture width and height, i.e., can I just use 1920x1080 for a full HD picture? Best Christine On Wed, May 25, 2016 at 3:46 AM, Yuan, Shengquan <[email protected]> wrote: > For vaCreateContext, I think render_targets/num_render_targets are > optional (it depends on driver implementation), and the surface of > vaBeginPicture can a brand-new surface > > VAStatus vaCreateContext ( > > VADisplay dpy, > > VAConfigID config_id, > > int picture_width, > > int picture_height, > > int flag, > > VASurfaceID *render_targets, > > int num_render_targets, > > VAContextID *context /* out */ > > ); > > > > DMA buffer can be imported through VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME, > e.g. > > VASurfaceAttribExternalBuffers buf; > > VASurfaceAttribType type, > > VASurfaceAttrib attrib_list[2] > > unsigned long prime_fd; /* an input variable, it is the imported prime > fd from other process */ > > > > int stride = frame_width_aligned, height_aligned = > frame_height_aligned; > > > > if (stride == 0) > > stride = frame_width_mbaligned; > > if (height_aligned == 0) > > height_aligned = frame_height_mbaligned; > > > > buf.pixel_format = VA_FOURCC_NV12; > > buf.width = frame_width_mbaligned; > > buf.height = frame_height_mbaligned; > > buf.data_size = stride * height_aligned * 1.5; > > buf.num_buffers = 1; /* import only 1 buffer */ > > buf.num_planes = 3; > > buf.pitches[0] = stride; > > buf.pitches[1] = stride; > > buf.pitches[2] = stride; > > buf.pitches[3] = 0; > > buf.offsets[0] = 0; > > buf.offsets[1] = stride * height_aligned; > > buf.offsets[2] = buf.offsets[1]; > > buf.offsets[3] = 0; > > buf.buffers = &prime_fd; > > buf.flags = 0; > > buf.private_data = NULL; > > > > attrib_list[0].type = (VASurfaceAttribType)VASurfaceAttribMemoryType; > > attrib_list[0].flags = VA_SURFACE_ATTRIB_SETTABLE; > > attrib_list[0].value.type = VAGenericValueTypeInteger; > > attrib_list[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME > > > > attrib_list[1].type = > (VASurfaceAttribType)VASurfaceAttribExternalBufferDescriptor; > > attrib_list[1].flags = VA_SURFACE_ATTRIB_SETTABLE; > > attrib_list[1].value.type = VAGenericValueTypePointer; > > attrib_list[1].value.value.p = (void *)buf; > > vaCreateSurfaces( > > va_dpy, > > VA_RT_FORMAT_YUV420, > > frame_width_mbaligned, frame_height_mbaligned, > > &surface_id, 1, > > &attrib_list, 2); > > > > > > *From:* Libva [mailto:[email protected]] *On Behalf Of * > Anon > *Sent:* Wednesday, May 25, 2016 2:23 PM > *To:* [email protected] > *Subject:* [Libva] encode surfaces created from prime fd (backed by > OpenGL 2D texture) > > > > Hi All, > > > > I want to implement the following use case on Intel Haswell CPU with HD > graphics: > > > > offscreen OpenGL rendering to OpenGL 2D texture -> use > EGL_MESA_image_dma_buf_export > to export the texture as prime fd -> vaCreateSurfaces from the prime fd -> > use vaapi to hw acclerate h264 encoding > > > > Is this supported by the latest va-api and libva-intel-driver release > (i.e., 1.7.0)? If so, is there any example I can start with? > > > > I did read the sample application h264encode.c and thought it might be a > good starting point. However, the first major issue I encountered is when > creating context through vaCreateContext, a number of pre-allocated va > surfaces are required and thus statically associated with the new va > context. However, with prime fd, the fd will change so a new va surface is > created with every new prime fd. I don't see any API can be used to > dynamically add/remove va surfaces after the context is created. Can you > please give me some suggestions? > > > > Best, > > Kristine >
_______________________________________________ Libva mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libva
