Questions regarding a new parser element based on GstBaseParse

Carlos Rafael Giani dv at pseudoterminal.org
Tue Jul 5 17:40:43 UTC 2016


Hello,

I want to add a parser for a format and use GstBaseParse as base class. 
However, this format has some peculiarities:

1) Audio data comes in 2048-byte blocks. No metadata between blocks, but 
one block equals the data for one channel. So, if this is stereo 
content, then I have to read 2*2048 bytes in order to output properly 
interleaved data. When I do TIME->BYTES conversions in the convert() 
vfunc, I plan on first doing the time->bytes conversion as usual (bytes 
= time * (sample_rate * bytes_per_sample * num_channels / GST_SECOND)), 
and then round down the result to an aligned value. So, with the stereo 
example from earlier, if for example the conversion yields a byte offset 
value of 6511, I would round it down to 4096, to ensure seeking does not 
end in the middle of a block. Does this make sense, or is there a better 
way?

2) Each block consists of 16-bit words, which are essentially the 
samples. I guess this means that when doing TIME->DEFAULT conversion, I 
should still do the conversion like this: default = time * (sample_rate 
/ GST_SECOND) , correct? DEFAULT is supposed to mean "sample" or "frame" 
with audio data, right?

3) At first, I have to read the headers. I plan on setting the 
min_frame_size to the size of the first header, read its contents, add 
the DROP flag to the GstBaseParseFrame, and return 
GST_BASE_PARSE_FLOW_DROPPED in handle_frame(). Is this the 
correct/recommended way?

4) Is it possible that a seek query comes in while I am still scanning 
the headers, that is, before I even finished a frame without dropping 
it? If so, what happens then?

5) There might be trailing padding data. I therefore need to know what 
the current position is (in BYTES) to ensure that this trailing data is 
excluded and the EOS is sent when the end of the valid data is reached. 
What is the proper way of doing this? gst_base_parse_set_duration() does 
not seem appropriate for this (and also I anyway want to use it to let 
the application know about the duration in nanoseconds).

6) In addition to this trailing padding data, this format allows for 
id3v2 content ... at the end of the file. id3demux does not seem to 
support this - but ID3v2 does (at least in version 2.4), although 
admittedly, support for ID3v2 tags at the end of files is uncommon. I 
guess a patch for id3demux would be the best approach here?


This format never allows for streaming, that is, the media always is of 
a known and finite length.

Is it still a good idea to use baseparse? Or should I actually use 
GstElement in this case?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20160705/5acdcb59/attachment.html>


More information about the gstreamer-devel mailing list