"""Limited authored SDP audio/rtpmap subset, not an offer/answer stack."""
import json
OFFER='v=0\no=- 1 1 IN IP4 192.0.2.10\ns=Owned fixture\nc=IN IP4 192.0.2.10\nt=0 0\nm=audio 49170 RTP/AVP 0 8 101\na=rtpmap:0 PCMU/8000\na=rtpmap:8 PCMA/8000\na=rtpmap:101 telephone-event/8000\n'
def parse_subset(text):
    lines=text.splitlines();media=[x for x in lines if x.startswith('m=')]
    if len(media)!=1:raise ValueError('exactly one media line required by this subset')
    fields=media[0][2:].split()
    if len(fields)<4 or fields[0]!='audio' or fields[2]!='RTP/AVP':raise ValueError('only authored audio RTP/AVP subset')
    pts=[int(x) for x in fields[3:]]
    if len(set(pts))!=len(pts):raise ValueError('duplicate payload number')
    mapping={}
    for line in lines:
        if line.startswith('a=rtpmap:'):
            pt,spec=line[len('a=rtpmap:'):].split();parts=spec.split('/');pt=int(pt)
            if len(parts) not in (2,3) or pt in mapping:raise ValueError('mapping shape or duplicate')
            mapping[pt]=(parts[0].lower(),int(parts[1]),int(parts[2]) if len(parts)==3 else 1)
    if any(pt not in mapping for pt in pts):raise ValueError('explicit rtpmap required here even for static formats')
    return {'port':int(fields[1]),'ordered_payloads':pts,'mapping':mapping}
def compare(offer,remote):
    common=[pt for pt in offer['ordered_payloads'] if offer['mapping'][pt] in remote and offer['mapping'][pt][0] not in ('telephone-event','cn')]
    return {'baseline_voice_payloads':common,'offered_port':offer['port'],'answer_media_fragment_only':'m=audio '+('49172' if common else '0')+' RTP/AVP '+' '.join(map(str,common or offer['ordered_payloads'][:1])),'full_compatibility_or_media_connection_proven':False,'fmtp_direction_security_and_network_checked':False}
def demo():
    offer=parse_subset(OFFER);cases=[]
    for name,remote in [('same_voice',[('pcmu',8000,1)]),('wrong_clock',[('pcmu',16000,1)]),('wrong_channels',[('pcmu',8000,2)]),('DTMF_only',[('telephone-event',8000,1)]),('second_voice',[('pcma',8000,1)])]:cases.append({'case':name,'remote_declared_tuples':remote,'comparison':compare(offer,remote)})
    assert [r['comparison']['baseline_voice_payloads'] for r in cases]==[[0],[],[],[],[8]]
    rejects=[]
    for name,text in [('missing_explicit_map',OFFER.replace('a=rtpmap:8 PCMA/8000\n','')),('second_media',OFFER+'m=video 49200 RTP/AVP 31\n'),('duplicate_payload',OFFER.replace('0 8 101','0 0 101'))]:
        try:parse_subset(text)
        except ValueError:rejects.append(name)
        else:raise AssertionError(name)
    return {'owned_offer_text':OFFER,'cases':cases,'negative_subset_inputs_rejected':rejects,'subset_rejection_not_universal_SDP_invalidity':True,'SIP_or_codec_or_network_executed':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
