Fix EBML input for live streams
This commit is contained in:
		
							parent
							
								
									a5bdaaaa5c
								
							
						
					
					
						commit
						9fd48f6e2f
					
				
					 1 changed files with 8 additions and 6 deletions
				
			
		| 
						 | 
					@ -143,14 +143,16 @@ namespace Mist{
 | 
				
			||||||
    ptr.truncate(0);
 | 
					    ptr.truncate(0);
 | 
				
			||||||
    readingMinimal = true;
 | 
					    readingMinimal = true;
 | 
				
			||||||
    uint32_t needed = EBML::Element::needBytes(ptr, ptr.size(), readingMinimal);
 | 
					    uint32_t needed = EBML::Element::needBytes(ptr, ptr.size(), readingMinimal);
 | 
				
			||||||
    while (ptr.size() < needed){
 | 
					    while (ptr.size() < needed && config->is_active){
 | 
				
			||||||
      if (!ptr.allocate(needed)){return false;}
 | 
					      if (!ptr.allocate(needed)){return false;}
 | 
				
			||||||
      int64_t toRead = needed - ptr.size();
 | 
					      int64_t toRead = needed - ptr.size();
 | 
				
			||||||
      int readResult = 0;
 | 
					      int readResult = 0;
 | 
				
			||||||
      while (!readResult){
 | 
					      while (!readResult){
 | 
				
			||||||
        readResult = fread(ptr + ptr.size(), toRead, 1, inFile);
 | 
					        readResult = fread(ptr + ptr.size(), toRead, 1, inFile);
 | 
				
			||||||
        if (!readResult){
 | 
					        if (!readResult){
 | 
				
			||||||
          if (errno == EINTR){continue;}
 | 
					          if (errno == EINTR){
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
          // At EOF we don't print a warning
 | 
					          // At EOF we don't print a warning
 | 
				
			||||||
          if (!feof(inFile)){
 | 
					          if (!feof(inFile)){
 | 
				
			||||||
            FAIL_MSG("Could not read more data! (have %zu, need %" PRIu32 ")", ptr.size(), needed);
 | 
					            FAIL_MSG("Could not read more data! (have %zu, need %" PRIu32 ")", ptr.size(), needed);
 | 
				
			||||||
| 
						 | 
					@ -436,7 +438,7 @@ namespace Mist{
 | 
				
			||||||
            frameSize = assStr.size();
 | 
					            frameSize = assStr.size();
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          if (frameSize){
 | 
					          if (frameSize){
 | 
				
			||||||
            TP.add(newTime * timeScale, idx, frameSize, lastClusterBPos, B.isKeyframe() && !isAudio, isVideo);
 | 
					            TP.add(newTime * timeScale, tNum, frameSize, lastClusterBPos, B.isKeyframe() && !isAudio, isVideo);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        while (TP.hasPackets()){
 | 
					        while (TP.hasPackets()){
 | 
				
			||||||
| 
						 | 
					@ -477,8 +479,9 @@ namespace Mist{
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void InputEBML::fillPacket(packetData &C){
 | 
					  void InputEBML::fillPacket(packetData &C){
 | 
				
			||||||
 | 
					    thisIdx = M.trackIDToIndex(C.track, getpid());
 | 
				
			||||||
    if (swapEndianness.count(C.track)){
 | 
					    if (swapEndianness.count(C.track)){
 | 
				
			||||||
      switch (M.getSize(M.trackIDToIndex(C.track, getpid()))){
 | 
					      switch (M.getSize(thisIdx)){
 | 
				
			||||||
      case 16:{
 | 
					      case 16:{
 | 
				
			||||||
        char *ptr = C.ptr;
 | 
					        char *ptr = C.ptr;
 | 
				
			||||||
        uint32_t ptrSize = C.dsize;
 | 
					        uint32_t ptrSize = C.dsize;
 | 
				
			||||||
| 
						 | 
					@ -514,7 +517,6 @@ namespace Mist{
 | 
				
			||||||
    thisPacket.genericFill(C.time, C.offset, C.track, C.ptr, C.dsize,
 | 
					    thisPacket.genericFill(C.time, C.offset, C.track, C.ptr, C.dsize,
 | 
				
			||||||
                           C.bpos, C.key);
 | 
					                           C.bpos, C.key);
 | 
				
			||||||
    thisTime = C.time;
 | 
					    thisTime = C.time;
 | 
				
			||||||
    thisIdx = C.track;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void InputEBML::getNext(size_t idx){
 | 
					  void InputEBML::getNext(size_t idx){
 | 
				
			||||||
| 
						 | 
					@ -613,7 +615,7 @@ namespace Mist{
 | 
				
			||||||
          memcpy(ptr, assStr.data(), frameSize);
 | 
					          memcpy(ptr, assStr.data(), frameSize);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (frameSize){
 | 
					        if (frameSize){
 | 
				
			||||||
          TP.add(newTime * timeScale, thisIdx, frameSize, lastClusterBPos,
 | 
					          TP.add(newTime * timeScale, tNum, frameSize, lastClusterBPos,
 | 
				
			||||||
                 B.isKeyframe() && !isAudio, isVideo, (void *)ptr);
 | 
					                 B.isKeyframe() && !isAudio, isVideo, (void *)ptr);
 | 
				
			||||||
          ++bufferedPacks;
 | 
					          ++bufferedPacks;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue