Fixed parsing of ADTS inside TS spread over multiple PES

This commit is contained in:
Thulinma 2016-07-07 22:30:34 +02:00
parent bd38fd20c3
commit d21c15fcdd
4 changed files with 87 additions and 13 deletions

View file

@ -104,21 +104,21 @@ namespace aac {
return (data[1] & 0x01 ? 7 : 9);
}
unsigned long adts::getPayloadSize() const{
unsigned long adts::getCompleteSize() const{
if (!data || len < 6){
return 0;
}
unsigned long ret = (((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] >> 5) & 0x07));
return (((data[3] & 0x03) << 11) | (data[4] << 3) | ((data[5] >> 5) & 0x07));
}
unsigned long adts::getPayloadSize() const{
unsigned long ret = getCompleteSize();
if (!ret){return ret;}//catch zero length
if (ret >= getHeaderSize()){
ret -= getHeaderSize();
}else{
return 0;//catch size less than header size (corrupt data)
}
if (len < ret + getHeaderSize() ){
ret = len - getHeaderSize();
//catch size less than length (corrupt data)
}
return ret;
}
@ -161,6 +161,9 @@ namespace aac {
return res.str();
}
adts::operator bool() const{
return (((int)data[0] << 4) | ((data[1] >> 4) & 0x0F)) == 0xfff && getFrequency();
return hasSync() && len && len >= getHeaderSize() && getFrequency();
}
bool adts::hasSync() const{
return len && (((int)data[0] << 4) | ((data[1] >> 4) & 0x0F)) == 0xfff;
}
}