[Bug 724716] New: tsparse: setting pipeline to PLAYING -> READY -> PLAYING is broken

GStreamer (bugzilla.gnome.org) bugzilla at gnome.org
Wed Feb 19 05:54:53 PST 2014


https://bugzilla.gnome.org/show_bug.cgi?id=724716
  GStreamer | gst-plugins-bad | git

           Summary: tsparse: setting pipeline to PLAYING -> READY ->
                    PLAYING is broken
    Classification: Platform
           Product: GStreamer
           Version: git
        OS/Version: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: Normal
         Component: gst-plugins-bad
        AssignedTo: gstreamer-bugs at lists.freedesktop.org
        ReportedBy: francois.seingier at gmail.com
         QAContact: gstreamer-bugs at lists.freedesktop.org
     GNOME version: ---


Created an attachment (id=269681)
 --> (https://bugzilla.gnome.org/attachment.cgi?id=269681)
test program

Hello,

I am building a simple pipeline with the following elements:

dvbbasebin +-- queue -- fakesink
           |
           +-- appsink

The first time I set the pipeline to PLAYING, data reaches the appsink.
But if I set the pipeline to READY (or NULL) and back to PLAYING again, no data
reaches the appsink anymore.

I tracked down the issue to mpegtsbase.c which dvbbasebin uses internally
(through tsparse).

As stated by the comment in mpegts_base_apply_pat():

/* Applying a new PAT does two things:
 * * It adds the new programs to the list of programs this element handles
 *   and increments at the same time the number of times a program is
referenced.
 *
 * * If there was a previously active PAT, It decrements the reference count
 *   of all program it used. If a program is no longer needed, it is removed.
 */

The thing is, setting the pipeline to READY does not destroy the previous PAT.
So setting the pipeline back to PLAYING will a) add the programs again and b)
remove all the programs it had just added.

Attached is a sample program I used to reproduce the issue and the logs from
GST_DEBUG=mpegtsbase:5.

The interesting part of the logs are:

0:00:15.616250290 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:727:mpegts_base_apply_pat:<mpegtsparse2-0> PAT
0:00:15.616261291 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 0,
pmt_pid : 16
0:00:15.616275819 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 0,
pmt_pid : 16
0:00:15.616336896 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:377:mpegts_base_add_program: Refcounting. Setting twice a PID
(0x0010) as known PSI
0:00:15.616354217 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 257,
pmt_pid : 110
0:00:15.616363647 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 257,
pmt_pid : 110
0:00:15.616408998 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 260,
pmt_pid : 310
0:00:15.616420434 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 260,
pmt_pid : 310
0:00:15.616486702 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 261,
pmt_pid : 510
0:00:15.616499692 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 261,
pmt_pid : 510
0:00:15.616544534 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 262,
pmt_pid : 610
0:00:15.616554588 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 262,
pmt_pid : 610
0:00:15.616611727 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 274,
pmt_pid : 210
0:00:15.616622808 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 274,
pmt_pid : 210
0:00:15.616669125 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:370:mpegts_base_add_program:<mpegtsparse2-0> program_number : 373,
pmt_pid : 710
0:00:15.616681246 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:351:mpegts_base_new_program:<mpegtsparse2-0> program_number : 373,
pmt_pid : 710
0:00:15.616700867 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0000 0x0010
0:00:15.616718277 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number : 0
0:00:15.616731542 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x0010) as known PSI
0:00:15.616743574 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0101 0x006e
0:00:15.616753661 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number :
257
0:00:15.616762438 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x006e) as known PSI
0:00:15.616772988 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0104 0x0136
0:00:15.616783026 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number :
260
0:00:15.616794347 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x0136) as known PSI
0:00:15.616804148 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0105 0x01fe
0:00:15.616813544 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number :
261
0:00:15.616822345 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x01fe) as known PSI
0:00:15.616831470 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0106 0x0262
0:00:15.616842126 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number :
262
0:00:15.616851467 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x0262) as known PSI
0:00:15.616872369 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0112 0x00d2
0:00:15.616883384 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number :
274
0:00:15.616893845 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x00d2) as known PSI
0:00:15.616904088 25030       0xa6f630 INFO              mpegtsbase
mpegtsbase.c:793:mpegts_base_apply_pat:<mpegtsparse2-0> PAT removing program
0x0175 0x02c6
0:00:15.616916695 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:439:mpegts_base_remove_program:<mpegtsparse2-0> program_number :
373
0:00:15.616928470 25030       0xa6f630 FIXME             mpegtsbase
mpegtsbase.c:804:mpegts_base_apply_pat: Program refcounting : Setting twice a
pid (0x02c6) as known PSI
0:00:15.617031749 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:903:mpegts_base_handle_psi: First PAT offset: 63167
0:00:15.663051718 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:896:mpegts_base_handle_psi: Handling PSI (pid: 0x0011 , table_id:
0x42)
0:00:15.734676190 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:896:mpegts_base_handle_psi: Handling PSI (pid: 0x0012 , table_id:
0x50)
0:00:15.774083569 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:896:mpegts_base_handle_psi: Handling PSI (pid: 0x0012 , table_id:
0x50)
0:00:15.781008411 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:896:mpegts_base_handle_psi: Handling PSI (pid: 0x0001 , table_id:
0x01)
0:00:15.788950526 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:896:mpegts_base_handle_psi: Handling PSI (pid: 0x0012 , table_id:
0x4f)
0:00:15.789025174 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:896:mpegts_base_handle_psi: Handling PSI (pid: 0x006e , table_id:
0x02)
0:00:15.789055142 25030       0xa6f630 DEBUG             mpegtsbase
mpegtsbase.c:841:mpegts_base_apply_pmt: Applying PMT (program_number:257,
pid:0x006e)
0:00:15.789068376 25030       0xa6f630 ERROR             mpegtsbase
mpegtsbase.c:879:mpegts_base_apply_pmt: Attempted to apply a PMT on a program
that wasn't created

As one can notice all the programs are added and immediately removed right
afterwards.

mpegts_base_reset() which is called on the PAUSED --> READY transition no
longer cleans up the PAT and the following comment explains why:

  /* FIXME : Commenting the Following lines is to be in sync with the following
   * commit
   *
   * 61a885613316ce7657c36a6cd215b43f9dc67b79
   *     mpegtsparse: don't free PAT structure which may still be needed later
   */

  /* if (base->pat != NULL) */
  /*   gst_structure_free (base->pat); */
  /* base->pat = NULL; */

I uncommented the code as follows:

  if (base->pat != NULL)
    g_ptr_array_unref (base->pat);
  base->pat = NULL;


It solved the PLAYING -- READY -- PLAYING issue. However I didn't look further
into the bug described in the comment and rather leave that to experts :)

-- 
Configure bugmail: https://bugzilla.gnome.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list