[gst-devel] 'segment->format == format' assertion failing in gstsegment when playing WM content

Andreas Schuler andreas at neokast.com
Tue May 6 00:41:50 CEST 2008


Hi all,

I am having some trouble playing back Windows Media content.

The setup is somewhat unique but necessary for my application:

   - 2 fakesrc components, which are injecting encoded audio and video data
   - Sources are connected to capsfilters, on which I am setting the correct
   input caps (see below)
   - Caps filters are connected to a multiqueue
   - Queue is connected to two decoding bins
   - Standard audio and video rendering tails (i.e. convert filters,
   rendering sinks etc.) are connected to decoding bin source pads

This setup actually works fine for XVID/MP3 encoded content but I didn't
have any luck getting it to play with WM content. The caps I have for audio
and video are as follows:

audio/x-wma, channels=(int)2, rate=(int)32000, wmaversion=(int)2,
bitrate=(int)32000, codec_data=(buffer)008800001f0000000000,
block_align=(int)768, depth=(int)16
video/x-wmv, width=(int)720, height=(int)496, framerate=(fraction)24/1,
wmvversion=(int)2, codec_data=(buffer)baf8ad00, format=(fourcc)WMV2

I have the same content in a regular WMV file, which is playing back fine
when using the playbin. I verified the caps with that setup (the only
difference appears to be the order of some of the fields and the video
framerate [the actual value is 23.97fps]):

audio/x-wma, wmaversion=(int)2, bitrate=(int)32000, depth=(int)16,
rate=(int)32000, channels=(int)2, block_align=(int)768,
codec_data=(buffer)008800001f0000000000
video/x-wmv, wmvversion=(int)2, framerate=(fraction)25/1, width=(int)720,
height=(int)496, codec_data=(buffer)baf8ad00, format=(fourcc)WMV2



When trying to play the content using the setup mention above I get a lot of
the following messages from gstsegment.c (702):

CRITICAL **: file E:\devel-release\src_releases\gstreamer\gst\gstsegment.c:
line 702: assertion `segment->format == format' failed

Enabling the debug output reveals the following from the dshow audio
decoder:

dshowaudiodec : received new segment from 0:00:00.000000000 to
99:99:99.999999999
dshowaudiodec : chain (size 768)=> pts 0:00:00.000000000 stop
0:00:00.192000000
dshowaudiodec : this buffer has a DISCONT flag (0:00:00.000000000), flushing
dshowaudiodec : chain (size 768)=> pts 0:00:00.128000000 stop
0:00:00.320000000
dshowaudiodec : buffer is out of segment, start 0:00:00.128000000 stop
0:00:00.256000000
dshowaudiodec : buffer is out of segment, start 0:00:00.256000000 stop
0:00:00.320000000
dshowaudiodec : chain (size 768)=> pts 0:00:00.320000000 stop
0:00:00.512000000
dshowaudiodec : buffer is out of segment, start 0:00:00.320000000 stop
0:00:00.448000000
dshowaudiodec : buffer is out of segment, start 0:00:00.448000000 stop
0:00:00.512000000
dshowaudiodec : chain (size 768)=> pts 0:00:00.512000000 stop
0:00:00.704000000
dshowaudiodec : buffer is out of segment, start 0:00:00.512000000 stop
0:00:00.640000000
dshowaudiodec : buffer is out of segment, start 0:00:00.640000000 stop
0:00:00.704000000
dshowaudiodec : chain (size 768)=> pts 0:00:00.704000000 stop
0:00:00.896000000
dshowaudiodec : buffer is out of segment, start 0:00:00.704000000 stop
0:00:00.832000000
dshowaudiodec : buffer is out of segment, start 0:00:00.832000000 stop
0:00:00.896000000

The video decoder is showing a similar picture:

dshowvideodec : new segment received => start=0:00:00.000000000
stop=99:99:99.999999999
dshowvideodec : chain (size 1749)=> pts 0:00:00.009000000 stop
0:00:00.010000000
dshowvideodec : this buffer has a DISCONT flag (0:00:00.009000000), flushing
dshowvideodec : buffer is out of segment, start 0:00:00.009000000 stop
0:00:00.010000000
dshowvideodec : chain (size 2972)=> pts 0:00:02.411000000 stop
0:00:02.412000000
dshowvideodec : buffer is out of segment, start 0:00:02.411000000 stop
0:00:02.412000000
dshowvideodec : chain (size 3735)=> pts 0:00:02.445000000 stop
0:00:02.446000000
dshowvideodec : buffer is out of segment, start 0:00:02.445000000 stop
0:00:02.446000000
dshowvideodec : chain (size 3500)=> pts 0:00:02.478000000 stop
0:00:02.479000000
dshowvideodec : buffer is out of segment, start 0:00:02.478000000 stop
0:00:02.479000000
dshowvideodec : chain (size 5141)=> pts 0:00:02.545000000 stop
0:00:02.546000000
dshowvideodec : buffer is out of segment, start 0:00:02.545000000 stop
0:00:02.546000000
dshowvideodec : chain (size 7849)=> pts 0:00:02.578000000 stop
0:00:02.579000000
dshowvideodec : buffer is out of segment, start 0:00:02.578000000 stop
0:00:02.579000000
dshowvideodec : chain (size 5101)=> pts 0:00:02.611000000 stop
0:00:02.612000000
dshowvideodec : buffer is out of segment, start 0:00:02.611000000 stop
0:00:02.612000000
dshowvideodec : chain (size 7712)=> pts 0:00:02.645000000 stop
0:00:02.646000000
dshowvideodec : buffer is out of segment, start 0:00:02.645000000 stop
0:00:02.646000000


I understand that the problem appears to be that the "format" in GstSegment
is not of type GST_FORMAT_TIME when "gst_segment_clip" is called in
gstdshowaudiocodec.c. The question is why. Can anyone point me in the right
direction on this one?

Thanks,

Andreas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20080505/8f9084cc/attachment.htm>


More information about the gstreamer-devel mailing list