Base parse fails to infer the correct PTS when splitting one video frame into several sub buffers.
Describe your issue
Base parse fails to infer the correct PTS when splitting one video frame into several sub buffers.
Observed Behavior
There are requests that we need to split one video frame into several sub buffers. For example, if we want to split the MKV stream(multi_slice_h264.mkv) into h264 NALs, using command line:
gst-launch-1.0 -vf filesrc location=multi_slice_h264.mkv ! matroskademux name=de de.video_0 ! h264parse ! video/x-h264,alignment=nal ! fakesin
k silent=false
The output is:
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (34 bytes, dts: none, pts: 0:00:00.000000000, duration: 0:00:00.000000000, offset: -1, offset_end: -1, flags: 00006440 discont header delta-unit tag-memory , meta: none) 0x7f3df001f120
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (8 bytes, dts: none, pts: none, duration: 0:00:00.000000000, offset: -1, offset_end: -1, flags: 00006440 discont header delta-unit tag-memory , meta: none) 0x7f3df001f480
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (288 bytes, dts: none, pts: none, duration: 0:00:00.033333333, offset: -1, offset_end: -1, flags: 00004040 dis
cont tag-memory , meta: none) 0x7f3df001f120
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (289 bytes, dts: none, pts: none, duration: 0:00:00.000000000, offset: -1, offset_end: -1, flags: 00004040 dis
cont tag-memory , meta: none) 0x560e960ccb40
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (4832 bytes, dts: none, pts: none, duration: 0:00:00.000000000, offset: -1, offset_end: -1, flags: 00004040 di
scont tag-memory , meta: none) 0x7f3df001f120
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (73 bytes, dts: none, pts: 0:00:00.033000000, duration: 0:00:00.033333333, offset: -1, offset_end: -1, flags:
00006000 delta-unit tag-memory , meta: none) 0x560e960cc6c0
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (74 bytes, dts: none, pts: none, duration: 0:00:00.000000000, offset: -1, offset_end: -1, flags: 00006000 delt
a-unit tag-memory , meta: none) 0x7f3df001f480
/GstPipeline:pipeline0/GstFakeSink:fakesink0: last-message = chain ******* (fakesink0:sink) (3480 bytes, dts: none, pts: none, duration: 0:00:00.000000000, offset: -1, offset_end: -1, flags: 00006000 de
lta-unit tag-memory , meta: none) 0x560e960cc6c0
We notice that only the first split output buffer of one input frame has PTS and others are none.
Expected Behavior
Each buffer should have correct PTS. Here, each sub buffers should have the same PTS as the input frame buffer.
Solutions you have tried
The same kind of issue also exists in VP9 and AV1 parse(maybe more). The base parse https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gstreamer/libs/gst/base/gstbaseparse.c#L2407 will always wipe out the PTS and DTS and infer a new one for us, which is not correct.
Related non-duplicate issues
We already have a lot of discuss at: !3182 (comment 1591585)