Do we need to support different allocation caps in basetransform?

Junyan He junyan.he at hotmail.com
Fri Jun 5 16:42:30 UTC 2020


We encountered a problem when we want to support GstVideoCropMeta in a 
vaapipostproc element.

the pipeline is:

gst-launch-1.0 videotestsrc num-buffers=100 ! capsfilter 
caps=video/x-raw,format=RGBA,width=800,height=600 ! videocrop left=200 
top=30 ! vaapipostproc ! vaapisink

The vaapipostproc can support GstVideoCropMeta and passes down the crop 
meta to down stream element. So the "negotiated caps" between 
vaapipostproc and vaapisink is "600x570 size", which is the 
final/display size. But the vaapipostproc needs the downstream element 
to allocate original size buffer, which is "800x600 size", and this 
should be the "allocation caps".

I just find in
   gst_base_transform_setcaps() ->
     gst_base_transform_find_transform() ->
     gst_base_transform_do_bufferpool ()
It always use the "negotiated caps" to set the bufferpool and we have no 
chance to set the real "allocation caps".

But in videodecoder base class, the "negotiated caps" and "allocation 
caps" can be different. When decoding, a 800x1080(negotiated caps) 
stream may need a 800x1088(allocation caps) size buffer allocated by 
downstream element's pool as the DPB.

So can we add some virtual function in basetransform to set the correct
"allocation caps"?

Can see:
https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/322

for details.


Thanks.


More information about the gstreamer-devel mailing list