1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/frame_buffer.h" 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 133f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <assert.h> 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h> 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1699199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com#include "webrtc/modules/video_coding/main/source/packet.h" 178edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org#include "webrtc/system_wrappers/interface/logging.h" 1899199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVCMFrameBuffer::VCMFrameBuffer() 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org : 238148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _state(kStateEmpty), 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _frameCounted(false), 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _nackCount(0), 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _latestPacketTimeMs(-1) { 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVCMFrameBuffer::~VCMFrameBuffer() { 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::VCMFrameBuffer(const VCMFrameBuffer& rhs) 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org: 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVCMEncodedFrame(rhs), 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_state(rhs._state), 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_frameCounted(rhs._frameCounted), 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_sessionInfo(), 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_nackCount(rhs._nackCount), 3999199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com_latestPacketTimeMs(rhs._latestPacketTimeMs) { 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _sessionInfo = rhs._sessionInfo; 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _sessionInfo.UpdateDataPointers(rhs._buffer, _buffer); 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgwebrtc::FrameType 4599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::FrameType() const { 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.FrameType(); 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 49dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.orgint32_t 5099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::GetLowSeqNum() const { 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.LowSequenceNumber(); 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.orgint32_t 5599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::GetHighSeqNum() const { 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.HighSequenceNumber(); 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VCMFrameBuffer::PictureId() const { 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.PictureId(); 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VCMFrameBuffer::TemporalId() const { 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.TemporalId(); 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VCMFrameBuffer::LayerSync() const { 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.LayerSync(); 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VCMFrameBuffer::Tl0PicId() const { 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.Tl0PicId(); 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VCMFrameBuffer::NonReference() const { 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.NonReference(); 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool 8099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::IsSessionComplete() const { 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.complete(); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Insert packet 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVCMFrameBufferEnum 867b2147f8975308f753380cf0248b84a733970a10agalusza@google.comVCMFrameBuffer::InsertPacket(const VCMPacket& packet, 877b2147f8975308f753380cf0248b84a733970a10agalusza@google.com int64_t timeInMs, 887b2147f8975308f753380cf0248b84a733970a10agalusza@google.com VCMDecodeErrorMode decode_error_mode, 8999199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com const FrameData& frame_data) { 908edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org assert(!(NULL == packet.dataPtr && packet.sizeBytes > 0)); 9199199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (packet.dataPtr != NULL) { 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _payloadType = packet.payloadType; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 9599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (kStateEmpty == _state) { 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // First packet (empty and/or media) inserted into this frame. 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // store some info and set some initial values. 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _timeStamp = packet.timestamp; 999d10769e109601915022fea44ec392645c3b0704wu@webrtc.org // We only take the ntp timestamp of the first packet of a frame. 1009d10769e109601915022fea44ec392645c3b0704wu@webrtc.org ntp_time_ms_ = packet.ntp_time_ms_; 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _codec = packet.codec; 10299199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (packet.frameType != kFrameEmpty) { 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // first media packet 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetState(kStateIncomplete); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 108dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org uint32_t requiredSizeBytes = Length() + packet.sizeBytes + 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (packet.insertStartCode ? kH264StartCodeLengthBytes : 0); 11099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (requiredSizeBytes >= _size) { 111dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org const uint8_t* prevBuffer = _buffer; 112dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org const uint32_t increments = requiredSizeBytes / 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kBufferIncStepSizeBytes + 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (requiredSizeBytes % 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kBufferIncStepSizeBytes > 0); 116dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org const uint32_t newSize = _size + 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org increments * kBufferIncStepSizeBytes; 11899199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (newSize > kMaxJBFrameSizeBytes) { 1198edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org LOG(LS_ERROR) << "Failed to insert packet due to frame being too " 1208edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org "big."; 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kSizeError; 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 1238edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org VerifyAndAllocate(newSize); 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _sessionInfo.UpdateDataPointers(prevBuffer, _buffer); 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1273740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org if (packet.width > 0 && packet.height > 0) { 1283740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org _encodedWidth = packet.width; 1293740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org _encodedHeight = packet.height; 1303740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org } 1313740808580c6020ac61ac11a8729fa0a6a08223cstefan@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CopyCodecSpecific(&packet.codecSpecificHeader); 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int retVal = _sessionInfo.InsertPacket(packet, _buffer, 1357b2147f8975308f753380cf0248b84a733970a10agalusza@google.com decode_error_mode, 13699199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com frame_data); 13799199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (retVal == -1) { 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kSizeError; 13999199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com } else if (retVal == -2) { 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kDuplicatePacket; 141d9416e60745ee0d91fac637eb7b43bd2c9765391mikhal@webrtc.org } else if (retVal == -3) { 142d9416e60745ee0d91fac637eb7b43bd2c9765391mikhal@webrtc.org return kOutOfBoundsPacket; 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // update length 145dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org _length = Length() + static_cast<uint32_t>(retVal); 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _latestPacketTimeMs = timeInMs; 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (_sessionInfo.complete()) { 1508148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org SetState(kStateComplete); 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kCompleteSession; 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else if (_sessionInfo.decodable()) { 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetState(kStateDecodable); 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kDecodableSession; 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kIncomplete; 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 159dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.orgint64_t 16099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::LatestPacketTimeMs() const { 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _latestPacketTimeMs; 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid 16599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::IncrementNackCount() { 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _nackCount++; 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 169dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.orgint16_t 17099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::GetNackCount() const { 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _nackCount; 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool 17599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::HaveFirstPacket() const { 176dd32d855fbfd8577bfb5d96df10d23ce28bfbacastefan@webrtc.org return _sessionInfo.HaveFirstPacket(); 177dd32d855fbfd8577bfb5d96df10d23ce28bfbacastefan@webrtc.org} 178dd32d855fbfd8577bfb5d96df10d23ce28bfbacastefan@webrtc.org 179dd32d855fbfd8577bfb5d96df10d23ce28bfbacastefan@webrtc.orgbool 18099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::HaveLastPacket() const { 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.HaveLastPacket(); 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 18499199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comint 18599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::NumPackets() const { 18699199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com return _sessionInfo.NumPackets(); 18799199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com} 18899199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid 19099199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::Reset() { 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _length = 0; 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _timeStamp = 0; 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _sessionInfo.Reset(); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _frameCounted = false; 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _payloadType = 0; 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _nackCount = 0; 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _latestPacketTimeMs = -1; 1988148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _state = kStateEmpty; 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMEncodedFrame::Reset(); 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Set state of frame 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid 20499199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::SetState(VCMFrameBufferStateEnum state) { 20599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (_state == state) { 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 20899199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com switch (state) { 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kStateIncomplete: 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // we can go to this state from state kStateEmpty 2118148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org assert(_state == kStateEmpty); 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Do nothing, we received a packet 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kStateComplete: 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(_state == kStateEmpty || 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _state == kStateIncomplete || 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _state == kStateDecodable); 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kStateEmpty: 2248148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org // Should only be set to empty through Reset(). 2258148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org assert(false); 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case kStateDecodable: 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(_state == kStateEmpty || 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _state == kStateIncomplete); 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _state = state; 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Set counted status (as counted by JB or not) 23799199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comvoid VCMFrameBuffer::SetCountedFrame(bool frameCounted) { 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _frameCounted = frameCounted; 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24199199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.combool VCMFrameBuffer::GetCountedFrame() const { 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _frameCounted; 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Get current state of frame 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVCMFrameBufferStateEnum 24799199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::GetState() const { 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _state; 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Get current state of frame 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVCMFrameBufferStateEnum 25399199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::GetState(uint32_t& timeStamp) const { 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timeStamp = TimeStamp(); 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return GetState(); 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool 25999199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::IsRetransmitted() const { 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _sessionInfo.session_nack(); 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid 26499199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.comVCMFrameBuffer::PrepareForDecode(bool continuous) { 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef INDEPENDENT_PARTITIONS 26699199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com if (_codec == kVideoCodecVP8) { 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _length = 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _sessionInfo.BuildVP8FragmentationHeader(_buffer, _length, 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &_fragmentation); 2708148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org } else { 2718148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org int bytes_removed = _sessionInfo.MakeDecodable(); 2728148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _length -= bytes_removed; 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 2748148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org#else 2758148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org int bytes_removed = _sessionInfo.MakeDecodable(); 2768148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _length -= bytes_removed; 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 2788148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org // Transfer frame information to EncodedFrame and create any codec 2798148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org // specific information. 2808148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _frameType = ConvertFrameType(_sessionInfo.FrameType()); 2818148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _completeFrame = _sessionInfo.complete(); 2828148118765d5b822258e7c6fc4f1155bc703a2dfstefan@webrtc.org _missingFrame = !continuous; 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 28599199e5b490cc99936d798ca5958cf9eb26228e0agalusza@google.com} // namespace webrtc 286