Re: Is it a good way to separate pipelines in order to dynamically change properties?

geysee via gstreamer-devel <[email protected]>
Newsgroups gmane.comp.video.gstreamer.devel
Message-ID <OFCF03011A.9C65FACC-ON49258A0F.001E59EC-49258A0F.001F370A@toa.co.jp>
Hi,
Mr.Nicolas.

I posted to the gitlab issues about the return code of the 
format-location.
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2911

I have another question about multifile.
I would like to ask the question with a different title.

Thank you very much.
Kamiya.


SHIGEHARU KAMIYA/TOA wrote on 2023/08/11 01:45:57:
> Hi,
> Mr.Nicolas.
> 
> I'm Kamiya.
> 
> I resolved the problem with the following code.
> The changing point is return type. I changed  GStrv* to  GStrv. 
> 
> --------------------------------------------------
> static GStrv formatLocationHandler(GstElement *src, gpointer udata)
> {
>    GStrv locations = (GStrv)g_new0(gchar*, 4);
> 
>    locations[0] = g_strdup("C:/Rec/2023/07/26/1808_28911.mp4");
>    locations[1] = g_strdup("C:/Rec/2023/07/26/1808_38919.mp4");
>    locations[2] = g_strdup("C:/Rec/2023/07/26/1808_47902.mp4");
>    locations[3] = nullptr;
> 
>    return locations;
> }
> --------------------------------------------------
> 
> Is this  a correct way?
> If it is correct way, the following document and the gst-inspect of 
> splitmuxsrc seems incorrect.
> 
https://gstreamer.freedesktop.org/documentation/multifile/splitmuxsrc.html
> 
> Best regards,
> Kamiya.
> 
> SHIGEHARU KAMIYA/TOA wrote on 2023/08/08 10:32:52:
> > 
> > Hi,
> > Mr.Nicolas.
> > 
> > I'm Kamiya.
> > 
> > Thank your for your advice.
> > I changed to "GStrv *ret   = (GStrv*)g_new0(GStrv, 4);" like below 
> > and no longer crashes.
> > 
> > -------------------------------------------
> > static GStrv* formatLocationHandler(GstElement *splitmux, gpointer 
udata)
> > {
> >     gchar **locations = (gchar**)g_new0(gchar*, 4);
> > 
> >     locations[0] = g_strdup("C:/Rec/2023/07/26/1808_28911.mp4");
> >     locations[1] = g_strdup("C:/Rec/2023/07/26/1808_38919.mp4");
> >     locations[2] = g_strdup("C:/Rec/2023/07/26/1808_47902.mp4");
> >     locations[3] = nullptr;
> > 
> >     GStrv *ret  = (GStrv*)g_new0(GStrv, 4);
> >     std::memcpy(ret, &locations, sizeof(locations));
> > 
> >     return ret;
> > }
> > -------------------------------------------
> > 
> > However, splitmuxsrc output the below error.
> > 
> > 0:00:01.696729000 69832 000001B40D38E600 DEBUG 
> > splitmuxsrc gstsplitmuxsrc.c:
> > 880:gst_splitmux_src_prepare_next_part:<splitmuxsrc0> Preparing file
> > part nエ (0)
> > 0:00:01.697042000 69832 000001B40D38E600 ERROR 
> > splitmuxpartreader gstsplitmuxpartreader.c:
> > 1410:bus_handler:<splitmuxpartreader0> Got error message from child 
> > <filesrc0> marking this reader as failed
> > 
> > "Preparing file part nエ (0)" in the log should be "Preparing file 
> > part C:/Rec/2023/07/26/1808_28911.mp4 (0)".
> > It seems that it's still not referenced correctly.
> > 
> > I also tried below code, but the result was the same.
> > 
> > -------------------------------------------
> > static GStrv* formatLocationHandler(GstElement *src, FileLoader *obj)
> > {
> >    GStrv *locations = (GStrv*)g_new0(GStrv, 4);
> >    *locations = (gchar**)g_new0(gchar*, 4);
> > 
> >    (*locations)[0] = g_strdup("C:/TOA/NR/Rec/2023/07/26/CH0001/
> > 1808_28911.mp4");
> >    (*locations)[1] = g_strdup("C:/TOA/NR/Rec/2023/07/26/CH0001/
> > 1808_38919.mp4");
> >    (*locations)[2] = g_strdup("C:/TOA/NR/Rec/2023/07/26/CH0001/
> > 1808_47902.mp4");
> >    (*locations)[3] = nullptr;
> > 
> >    return locations;
> > }
> > -------------------------------------------
> > 
> > I'm embarrassed for not understanding pointers correctly.
> > Could you give me some advice or example code once more?
> > 
> > Best regards,
> > Kamiya.
> > 
> > "Nicolas Dufresne" <[email protected]> wrote on 2023/08/08 
03:35:25:
> > > Le lundi 07 ao?t 2023 ? 20:07 +0900, geysee via gstreamer-devel a 
?crit :
> > > > Hi,
> > > >
> > > > Mr. Nicolas.
> > > >
> > > >
> > > > I'm Kamiya.
> > > >
> > > >
> > > > I'm trying to combine multiple files with the splitmuxsrc signal
> > > > "format_location" you advised.
> > > >
> > > > I haven't tried concat element yet. I thought that splitmuxsrc 
> > would be more
> > > > suitable because of the large number of files.
> > > >
> > > >
> > > > It succeeded when the return value of GStrv* type was initialized 
as an
> > > > array.(code below)
> > > >
> > > >
> > > > -----------------------------
> > > >
> > > > static GStrv* formatLocationHandler(GstElement *splitmux, 
> gpointer udata)
> > > >
> > > > {
> > > >
> > > >     gchar *locations[4];
> > > >
> > > >
> > > >     locations[0] = g_strdup("C:/Rec/2023/07/26/1808_28911.mp4");
> > > >
> > > >     locations[1] = g_strdup("C:/Rec/2023/07/26/1808_38919.mp4");
> > > >
> > > >     locations[2] = g_strdup("C:/Rec/2023/07/26/1808_47902.mp4");
> > > >
> > > >     locations[3] = nullptr;
> > > >
> > > >
> > > >     GStrv *ret  = (GStrv*)g_new0(GStrv, 1);
> > > >
> > > >     std::memcpy(ret, &locations, sizeof(locations));

> > > You have 1 pointer allocated, but memcopy 4, this is going to 
overflow.

> > > >
> > > >
> > > >
> > > >     return ret;
> > > >
> > > > }
> > > >
> > > > -----------------------------
> > > >
> > > >
> > > > On the other hand, if the return value was dynamically 
> > allocated, it will be
> > > > crashed after exiting formatLocationHandler.(code below)
> > > >
> > > >
> > > > -----------------------------
> > > >
> > > > static GStrv* formatLocationHandler(GstElement *splitmux, 
> gpointer udata)
> > > >
> > > > {
> > > >
> > > >     gchar **locations = (gchar**)g_new0(gchar*, 4);
> > > >
> > > >
> > > >     locations[0] = g_strdup("C:/Rec/2023/07/26/1808_28911.mp4");
> > > >
> > > >     locations[1] = g_strdup("C:/Rec/2023/07/26/1808_38919.mp4");
> > > >
> > > >     locations[2] = g_strdup("C:/Rec/2023/07/26/1808_47902.mp4");
> > > >
> > > >     locations[3] = nullptr;
> > > >
> > > >
> > > >     GStrv *ret  = (GStrv*)g_new0(GStrv, 1);
> > > >
> > > >     std::memcpy(ret, &locations, sizeof(locations));

> > > Same bug, it just worked by accident previously.

> > > >
> > > >
> > > >
> > > >     return ret;
> > > >
> > > > }
> > > >
> > > > -----------------------------
> > > >
> > > >
> > > > Could you tell me how to dynamically allocate the file list in
> > > > formatLocationHandler ?
> > > >
> > > > I am very embarrassed that it may be a basic problem with C 
> > > language or GLib,
> > > > but I have been unable to solve it for a long time, so I would 
> > > appreciate your
> > > > help.
> > > >
> > > >
> > > > Best regards,
> > > >
> > > > Kamiya.
> > > >
> > > >
> > > >
> > > > SHIGEHARU KAMIYA/TOA wrote on 2023/08/03 12:04:11:
> > > >
> > > > >
> > > > > Hi,
> > > >
> > > > > Mr. Nicolas.
> > > >
> > > > >
> > > > > Thank you for your reply.
> > > >
> > > > > Your way looks nice!
> > > >
> > > > >
> > > > > I am trying it now.
> > > >
> > > > > I will let you know the results later.
> > > >
> > > > >
> > > > > Thank you.
> > > >
> > > > > Kamiya.
> > > >
> > > > >
> > > > > "gstreamer-devel" 
<[email protected]>
> > > > > wrote on 2023/08/03 07:09:52:
> > > >
> > > > > >
> > > > > > Hi,
> > > >
> > > > > > Le mar. 1 ao?t 2023, 03 h 15, geysee via gstreamer-devel <
> > > > > > [email protected]> a ?crit :
> > > >
> > > > > > > Hello
> > > > > > > I am Kamiya.
> > > > > > >
> > > > > > > I have a question.
> > > > > > >
> > > > > > > Is it a good way to separate pipelines in order to 
> > dynamically change
> > > > > > > properties
> > > > > > > that cannot be changed in the PLAYING state, such as the 
location
> > > > property
> > > > > > > in filesrc?
> > > >
> > > > > >
> > > > > > It can be a good method. But from what you described below, 
> > you may get
> > > > > > easier results with concat element instead. splitmuxsrc should
> > > work, there
> > > > > > is a signal to query the filename from your app instead of 
> > > using the glob.
> > > >
> > > > > >
> > > > > > >
> > > > > > > I'm sorry for the long post, but the background of the 
> > question is as
> > > > > > > follows.
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > 
> > > 
> 
----------------------------------------------------------------------------
> > > > -----------------------------------------------------
> > > > > > > I'm making a system that records video from a network camera 
while
> > > > > > > dividing it into files.
> > > > > > > If the file is split at 10 minute intervals, the file 
> pathwill be as
> > > > > > > follows.
> > > > > > >
> > > > > > > C:/Rec/2023/07/31/1330_00000.mp4
> > > > > > > C:/Rec/2023/07/31/1340_00000.mp4
> > > > > > > C:/Rec/2023/07/31/1350_00000.mp4
> > > > > > >
> > > > > > > With gstreamer C++ coding, I am trying to export as a 
> single file by
> > > > > > > specifying the date and time range from the divided 
> recording files.
> > > > > > >
> > > > > > > If the date and time range is in one file, like 13:32 - 13:
> > > 34, then the
> > > > > > > pipeline below has been successful. (Properties are omitted)
> > > > > > >
> > > > > > > pileline : filesrc ! qtdemux ! h265parse ! queue ! qtmux! 
filesink
> > > > > > >
> > > > > > > On the other hand, if the date and time range is split 
> into multiple
> > > > > > > files, like 7/31 20:00 - 8/1 10:00, this pipeline fails.
> > > > > > >
> > > > > > > First, I tried multifilesrc and splitmuxsrc, but the 
> > location property
> > > > is
> > > > > > > a glob pattern, it didn't fit the file path of date and 
time.
> > > > > > > Next, I tried updating the location property of filesrc 
> > sequentially,
> > > > but
> > > > > > > I couldn't change the location when this state is PLAYING.
> > > > > > >
> > > > > > > So now I'm trying to divide the pipeline into two as 
follows.
> > > > > > >
> > > > > > > pipeline1 : filesrc ! qtdemux ! h265parse ! appsink
> > > > > > > pipeline2 : appsrc ! queue ! qtmux ! filesink
> > > > > > >
> > > > > > > When pipeline1 reaches the end of stream, I change the state 
of
> > > > pipeline1
> > > > > > > to Ready.
> > > > > > > Next I change the location of filesrc. Finaly I change 
> > stateto PLAYING
> > > > > > > again.
> > > > > > > The State of pipeline2 is not changed.
> > > > > > >
> > > > > > > However this way has not been successful yet. There are 
> > more problems
> > > > than
> > > > > > > single pipeline.
> > > > > > >
> > > > > > > Currently looking into the following issues:
> > > > > > > If there was single pipeline it was processed at high 
> > speed,but if the
> > > > > > > pipeline is divided, the processing time will be as per 
> > the timestamp.
> > > > > > >
> > > > > > > Is it a good way to split the pipeline like this?
> > > > > > > I would appreciate if you give me some advice.
> > > > > > >
> > > > > > >
> > > > > >
> > > > > 
> > > 
> 
----------------------------------------------------------------------------
> > > > -----------------------------------------------------
> > > > > > >
> > > > > > > Best regards,
> > > > > > > Kamiya.
> > > >
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.