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