sangwonl / python-mpegdash

MPEG-DASH MPD(Media Presentation Description) Parser
MIT License
104 stars 53 forks source link

Wrong type of SubRepresentation.content_component #40

Closed nirb999 closed 2 years ago

nirb999 commented 3 years ago

In file mpegdash/nodes.py:

self.content_component = parse_attr_value(xmlnode, 'contentComponent', [str])

shouldn't it be: self.content_component = parse_attr_value(xmlnode, 'contentComponent', str) or self.content_component = parse_attr_value(xmlnode, 'contentComponent', int) ?

try this code:

import mpegdash.parser

mpd = '''
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" type="dynamic" minimumUpdatePeriod="PT30S" availabilityStartTime="2014-02-05T22:29:56" minBufferTime="PT12S" timeShiftBufferDepth="PT1M0S" profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <BaseURL>http://test-i.akamaihd.net/dash/live/500002/linearprogram1</BaseURL>
  <BaseURL>http://test-i.akamaihd.net/dash/live/500002-b/linearprogram</BaseURL>
  <Period start="PT0S" duration="PT1M0.6S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.42CE,mp4a.40.5" frameRate="15000/1001" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentstartWithSAP="1" bitstreamSwitching="true">
      <ContentComponent contentType="video" id="1" />
      <SegmentTemplate timescale="90000" duration="540000" startNumber="74247" />
      <Representation id="1" width="640" height="360" bandwidth="600000">
        <SubRepresentation contentComponent="1" bandwidth="600000" codecs="avc1.42C01E" />
        <SegmentTemplate duration="540000" startNumber="74247" media="dash_video600-$Number$.mp4" initialization="dash_video600-.init" />
      </Representation>
      <Representation id="2" width="320" height="180" bandwidth="200000">
        <SubRepresentation contentComponent="1" bandwidth="200000" codecs="avc1.42C01E" />
        <SegmentTemplate duration="540000" startNumber="74248" media="dash_video200-$Number$.mp4" initialization="dash_video200-.init" />
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>
'''

parsed_mpd = mpegdash.parser.MPEGDASHParser.parse(mpd)
new_mpd = mpegdash.parser.MPEGDASHParser.toprettyxml(parsed_mpd)
print(new_mpd)

The output contains this: contentComponent="[<class 'str'>]" :

<?xml version="1.0" ?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="2014-02-05T22:29:56" minimumUpdatePeriod="PT30S" minBufferTime="PT12S" timeShiftBufferDepth="PT1M0S">
    <BaseURL>http://test-i.akamaihd.net/dash/live/500002/linearprogram1</BaseURL>
    <BaseURL>http://test-i.akamaihd.net/dash/live/500002-b/linearprogram</BaseURL>
    <Period id="1" start="PT0S" duration="PT1M0.6S">
        <AdaptationSet frameRate="15000/1001" mimeType="video/mp4" codecs="avc1.42CE,mp4a.40.5" startWithSAP="1" segmentAlignment="true" subsegmentAlignment="true" bitstreamSwitching="true">
            <ContentComponent id="1" contentType="video"/>
            <SegmentTemplate timescale="90000" duration="540000" startNumber="74247"/>
            <Representation width="640" height="360" id="1" bandwidth="600000">
                <SegmentTemplate duration="540000" startNumber="74247" media="dash_video600-$Number$.mp4" initialization="dash_video600-.init"/>
                <SubRepresentation codecs="avc1.42C01E" bandwidth="600000" contentComponent="[&lt;class 'str'&gt;]"/>
            </Representation>
            <Representation width="320" height="180" id="2" bandwidth="200000">
                <SegmentTemplate duration="540000" startNumber="74248" media="dash_video200-$Number$.mp4" initialization="dash_video200-.init"/>
                <SubRepresentation codecs="avc1.42C01E" bandwidth="200000" contentComponent="[&lt;class 'str'&gt;]"/>
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>

manifest example taken from here: https://learn.akamai.com/en-us/webhelp/media-services-live/media-services-live-hls-hds-and-dash-ingest-user-guide-v3.2/GUID-A32F2823-ED4D-470B-9BC3-C4C455FE2F47.html

davemevans commented 3 years ago

Yes, it should probably be str. dependencyLevel should probably be str too. Either these, or they should be parsed and written "properly", ie as whitespace-seperated lists.

As it is, is is definitely wrong 😄

sangwonl commented 3 years ago

Hi guys, I believe https://github.com/sangwonl/python-mpegdash/pull/48 should fix the bug. Could you try it and share if it works?

Thanks.

sangwonl commented 2 years ago

Closing this issue for now since it looks to work with the patch, but if it's still happening please file a new issue. Thanks.