Improved NAL unit and keyframe handling

This commit is contained in:
Thulinma 2017-05-15 17:11:24 +02:00
parent 5be4892ae5
commit 1f3ab6e473
4 changed files with 21 additions and 39 deletions

View file

@ -127,7 +127,7 @@ namespace DTSC {
bool getFlag(const char * identifier) const; bool getFlag(const char * identifier) const;
bool hasMember(const char * identifier) const; bool hasMember(const char * identifier) const;
void appendNal(const char * appendData, uint32_t appendLen, uint32_t totalLen); void appendNal(const char * appendData, uint32_t appendLen, uint32_t totalLen);
void clearKeyFrame(); void setKeyFrame(bool kf);
long long unsigned int getTime() const; long long unsigned int getTime() const;
long int getTrackId() const; long int getTrackId() const;
char * getData() const; char * getData() const;

View file

@ -271,21 +271,23 @@ namespace DTSC {
memcpy(data+offset+11+packDataSize, "\000\000\356", 3); memcpy(data+offset+11+packDataSize, "\000\000\356", 3);
} }
///clear the keyframe byte. ///sets the keyframe byte.
void Packet::clearKeyFrame(){ void Packet::setKeyFrame(bool kf){
uint32_t offset = 23; uint32_t offset = 23;
while (data[offset] != 'd' && data[offset] != 'k'){ while (data[offset] != 'd' && data[offset] != 'k' && data[offset] != 'K'){
switch (data[offset]){ switch (data[offset]){
case 'o': offset += 17; break; case 'o': offset += 17; break;
case 'b': offset += 15; break; case 'b': offset += 15; break;
default: default:
FAIL_MSG("Errrrrrr"); FAIL_MSG("Unknown field: %c", data[offset]);
} }
} }
if(data[offset] == 'k'){ if(data[offset] == 'k' || data[offset] == 'K'){
data[offset] = 'K'; data[offset] = (kf?'k':'K');
data[offset+16] = 0; data[offset+16] = (kf?1:0);
}else{
ERROR_MSG("Could not set keyframe - field not found!");
} }
} }
@ -327,8 +329,9 @@ namespace DTSC {
case 'o': offset += 17; break; case 'o': offset += 17; break;
case 'b': offset += 15; break; case 'b': offset += 15; break;
case 'k': offset += 19; break; case 'k': offset += 19; break;
case 'K': offset += 19; break;
default: default:
FAIL_MSG("Errrrrrr"); FAIL_MSG("Unknown field: %c", data[offset]);
return -1; return -1;
} }
} }

View file

@ -69,54 +69,33 @@ namespace nalu {
return dataSize; return dataSize;
} }
///Scans data for the last non-zero byte, returning a pointer to it.
const char* nalEndPosition(const char * data, uint32_t dataSize){ const char* nalEndPosition(const char * data, uint32_t dataSize){
while(dataSize > 0 && memcmp(data+dataSize-1, "\000",1) == 0 ){ while(dataSize > 0 && memcmp(data+dataSize-1, "\000",1) == 0 ){
dataSize--; dataSize--;
} }
return data+dataSize; return data+dataSize;
} }
///scan data stream for startcode. return pointer to location when found, NULL otherwise ///Scan data for Annex B start code. Returns pointer to it when found, null otherwise.
void scanAnnexB(const char * data, uint32_t dataSize, const char *& packetPointer){ const char * scanAnnexB(const char * data, uint32_t dataSize){
int offset = 0; int offset = 0;
while(offset+2 < dataSize){ while(offset+2 < dataSize){
const char * begin = data + offset; const char * begin = data + offset;
// int t = ((((int*)begin)[0]) >> 8) & 0x00FFFFFF;
int t = (int)((begin[0] << 8)|((begin[1]) << 8)|(begin[2])); int t = (int)((begin[0] << 8)|((begin[1]) << 8)|(begin[2]));
//int t = (int)((begin[0]|begin[1]) << 1)|(begin[2]);
//search for startcode
//if(memcmp(begin, "\000\000\001",3) != 0){
if(t != 1){ if(t != 1){
if (begin[2]){//skip three bytes if the last one isn't zero
//if((t & 0x0000FF != 0 ))
if((int)begin[2] != 0 ) //XX1
{
offset +=3; offset +=3;
}else if(((int)begin[1] == 1) && ((int)begin[2] ==0)){ //X10 }else if (begin[1]){//skip two bytes if the second one isn't zero
offset +=2; offset +=2;
}else{ }else{//All other cases, skip one byte
offset++; //[X00]? incr with 1 because the startcode could be one at 1byte offset.
}
/*
if(t != 0 )
{
offset += 3;
}else{
offset++; offset++;
} }
*/
// offset++;
}else{ }else{
packetPointer = begin; return begin;
return;
} }
} }
return 0;
packetPointer = NULL;
} }
unsigned long fromAnnexB(const char * data, unsigned long dataSize, char *& result){ unsigned long fromAnnexB(const char * data, unsigned long dataSize, char *& result){

View file

@ -16,6 +16,6 @@ namespace nalu {
unsigned long toAnnexB(const char * data, unsigned long dataSize, char *& result); unsigned long toAnnexB(const char * data, unsigned long dataSize, char *& result);
unsigned long fromAnnexB(const char * data, unsigned long dataSize, char *& result); unsigned long fromAnnexB(const char * data, unsigned long dataSize, char *& result);
void scanAnnexB(const char * data, uint32_t dataSize, const char *& packetPointer); const char* scanAnnexB(const char * data, uint32_t dataSize);
const char* nalEndPosition(const char * data, uint32_t dataSize); const char* nalEndPosition(const char * data, uint32_t dataSize);
} }