Commit 6d3d0272 by xiongziliang

删除冗余文件

更新licence日期
parent 6a649174
Subproject commit 7cfb157c63ce33c2e14461c0b9fe444318bfd217
Subproject commit 682965692e26ac50652cb574625e3f20e1a651ba
MIT License
Copyright (c) 2016 xiongziliang <771730766@qq.com>
Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......@@ -26,7 +26,7 @@
#include "H264.h"
#include "H264/SPSParser.h"
#include "SPSParser.h"
#include "Util/logger.h"
using namespace toolkit;
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "H264Parser.h"
#include "Util/logger.h"
using namespace toolkit;
H264Parser::H264Parser(){
}
H264Parser::~H264Parser(){
}
void H264Parser::inputH264(const string &h264,uint32_t dts){
_parser.SetStream((const uint8_t *)h264.data(), h264.size());
while (true) {
if(media::H264Parser::kOk != _parser.AdvanceToNextNALU(&_nalu)){
break;
}
switch (_nalu.nal_unit_type) {
case media::H264NALU::kNonIDRSlice:
case media::H264NALU::kIDRSlice:{
if(media::H264Parser::kOk == _parser.ParseSliceHeader(_nalu, &_shdr)){
const media::H264SPS *pPps = _parser.GetSPS(_shdr.pic_parameter_set_id);
if (pPps) {
_poc.ComputePicOrderCnt(pPps, _shdr, &_iNowPOC);
computePts(dts);
}
}
}
break;
case media::H264NALU::kSPS:{
int sps_id;
_parser.ParseSPS(&sps_id);
}
break;
case media::H264NALU::kPPS:{
int pps_id;
_parser.ParsePPS(&pps_id);
}
break;
default:
break;
}
}
}
void H264Parser::computePts(uint32_t iNowDTS) {
auto iPOCInc = _iNowPOC - _iLastPOC;
if (_shdr.slice_type % 5 == 1) {
//这是B帧
_iNowPTS = _iLastPTS + _iMsPerPOC * (iPOCInc);
} else {
//这是I帧或者P帧
_iNowPTS = iNowDTS;
//计算每一POC的时间
if(iPOCInc == 0){
WarnL << "iPOCInc = 0," << _iNowPOC << " " << _iLastPOC;
}else{
_iMsPerPOC = (_iNowPTS - _iLastPTS) / iPOCInc;
}
_iLastPTS = _iNowPTS;
_iLastPOC = _iNowPOC;
}
// DebugL << _shdr.slice_type
// <<"\r\nNOW:"
// << _iNowPOC << " "
// << _iNowPTS << " "
// << iNowDTS << " "
// << "\r\nLST:"
// << _iLastPOC << " "
// << _iLastPTS << " "
// << _iMsPerPOC << endl;
}
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef H264Parser_h
#define H264Parser_h
#include <stdio.h>
#include <string>
#include "h264_poc.h"
#include "h264_parser.h"
using namespace std;
#ifndef INT32_MAX
#define INT32_MAX 0x7FFFFFFF
#endif//INT32_MAX
class H264Parser{
public:
H264Parser();
virtual ~H264Parser();
void inputH264(const string &h264,uint32_t dts);
int32_t getPOC() const{
return _iNowPOC;
}
int getSliceType() const{
return _shdr.slice_type;
}
int getNaluType() const{
return _nalu.nal_unit_type;
}
uint32_t getPts() const{
return _iNowPTS;
}
private:
media::H264Parser _parser;
media::H264POC _poc;
media::H264NALU _nalu;
media::H264SliceHeader _shdr;
int32_t _iNowPOC = INT32_MAX;
int32_t _iLastPOC = INT32_MAX;
uint32_t _iNowPTS = INT32_MAX;
uint32_t _iLastPTS = INT32_MAX;
int32_t _iMsPerPOC = 30;
void computePts(uint32_t dts);
};
#endif /* H264Parser_hpp */
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "h264_bit_reader.h"
#include "macros.h"
namespace media {
H264BitReader::H264BitReader()
: data_(NULL),
bytes_left_(0),
curr_byte_(0),
num_remaining_bits_in_curr_byte_(0),
prev_two_bytes_(0),
emulation_prevention_bytes_(0) {}
H264BitReader::~H264BitReader() {}
bool H264BitReader::Initialize(const uint8_t* data, off_t size) {
DCHECK(data);
if (size < 1)
return false;
data_ = data;
bytes_left_ = size;
num_remaining_bits_in_curr_byte_ = 0;
// Initially set to 0xffff to accept all initial two-byte sequences.
prev_two_bytes_ = 0xffff;
emulation_prevention_bytes_ = 0;
return true;
}
bool H264BitReader::UpdateCurrByte() {
if (bytes_left_ < 1)
return false;
// Emulation prevention three-byte detection.
// If a sequence of 0x000003 is found, skip (ignore) the last byte (0x03).
if (*data_ == 0x03 && (prev_two_bytes_ & 0xffff) == 0) {
// Detected 0x000003, skip last byte.
++data_;
--bytes_left_;
++emulation_prevention_bytes_;
// Need another full three bytes before we can detect the sequence again.
prev_two_bytes_ = 0xffff;
if (bytes_left_ < 1)
return false;
}
// Load a new byte and advance pointers.
curr_byte_ = *data_++ & 0xff;
--bytes_left_;
num_remaining_bits_in_curr_byte_ = 8;
prev_two_bytes_ = ((prev_two_bytes_ & 0xff) << 8) | curr_byte_;
return true;
}
// Read |num_bits| (1 to 31 inclusive) from the stream and return them
// in |out|, with first bit in the stream as MSB in |out| at position
// (|num_bits| - 1).
bool H264BitReader::ReadBits(int num_bits, int* out) {
int bits_left = num_bits;
*out = 0;
DCHECK(num_bits <= 31);
while (num_remaining_bits_in_curr_byte_ < bits_left) {
// Take all that's left in current byte, shift to make space for the rest.
*out |= (curr_byte_ << (bits_left - num_remaining_bits_in_curr_byte_));
bits_left -= num_remaining_bits_in_curr_byte_;
if (!UpdateCurrByte())
return false;
}
*out |= (curr_byte_ >> (num_remaining_bits_in_curr_byte_ - bits_left));
*out &= ((1u << num_bits) - 1u);
num_remaining_bits_in_curr_byte_ -= bits_left;
return true;
}
off_t H264BitReader::NumBitsLeft() {
return (num_remaining_bits_in_curr_byte_ + bytes_left_ * 8);
}
bool H264BitReader::HasMoreRBSPData() {
// Make sure we have more bits, if we are at 0 bits in current byte and
// updating current byte fails, we don't have more data anyway.
if (num_remaining_bits_in_curr_byte_ == 0 && !UpdateCurrByte())
return false;
// If there is no more RBSP data, then |curr_byte_| contains the stop bit and
// zero padding. Check to see if there is other data instead.
// (We don't actually check for the stop bit itself, instead treating the
// invalid case of all trailing zeros identically).
if ((curr_byte_ & ((1 << (num_remaining_bits_in_curr_byte_ - 1)) - 1)) != 0)
return true;
// While the spec disallows it (7.4.1: "The last byte of the NAL unit shall
// not be equal to 0x00"), some streams have trailing null bytes anyway. We
// don't handle emulation prevention sequences because HasMoreRBSPData() is
// not used when parsing slices (where cabac_zero_word elements are legal).
for (off_t i = 0; i < bytes_left_; i++) {
if (data_[i] != 0)
return true;
}
bytes_left_ = 0;
return false;
}
size_t H264BitReader::NumEmulationPreventionBytesRead() {
return emulation_prevention_bytes_;
}
} // namespace media
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// This file contains an implementation of an H264 Annex-B video stream parser.
#ifndef MEDIA_FILTERS_H264_BIT_READER_H_
#define MEDIA_FILTERS_H264_BIT_READER_H_
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
#include "macros.h"
using namespace std;
namespace media {
// A class to provide bit-granularity reading of H.264 streams.
// This is not a generic bit reader class, as it takes into account
// H.264 stream-specific constraints, such as skipping emulation-prevention
// bytes and stop bits. See spec for more details.
class MEDIA_EXPORT H264BitReader {
public:
H264BitReader();
~H264BitReader();
// Initialize the reader to start reading at |data|, |size| being size
// of |data| in bytes.
// Return false on insufficient size of stream..
// TODO(posciak,fischman): consider replacing Initialize() with
// heap-allocating and creating bit readers on demand instead.
bool Initialize(const uint8_t* data, off_t size);
// Read |num_bits| next bits from stream and return in |*out|, first bit
// from the stream starting at |num_bits| position in |*out|.
// |num_bits| may be 1-32, inclusive.
// Return false if the given number of bits cannot be read (not enough
// bits in the stream), true otherwise.
bool ReadBits(int num_bits, int* out);
// Return the number of bits left in the stream.
off_t NumBitsLeft();
// See the definition of more_rbsp_data() in spec.
bool HasMoreRBSPData();
// Return the number of emulation prevention bytes already read.
size_t NumEmulationPreventionBytesRead();
private:
// Advance to the next byte, loading it into curr_byte_.
// Return false on end of stream.
bool UpdateCurrByte();
// Pointer to the next unread (not in curr_byte_) byte in the stream.
const uint8_t* data_;
// Bytes left in the stream (without the curr_byte_).
off_t bytes_left_;
// Contents of the current byte; first unread bit starting at position
// 8 - num_remaining_bits_in_curr_byte_ from MSB.
int curr_byte_;
// Number of bits remaining in curr_byte_
int num_remaining_bits_in_curr_byte_;
// Used in emulation prevention three byte detection (see spec).
// Initially set to 0xffff to accept all initial two-byte sequences.
int prev_two_bytes_;
// Number of emulation preventation bytes (0x000003) we met.
size_t emulation_prevention_bytes_;
DISALLOW_COPY_AND_ASSIGN(H264BitReader);
};
} // namespace media
#endif // MEDIA_FILTERS_H264_BIT_READER_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_VIDEO_H264_POC_H_
#define MEDIA_VIDEO_H264_POC_H_
#include <stdint.h>
#include "macros.h"
using namespace std;
namespace media {
struct H264SPS;
struct H264SliceHeader;
class MEDIA_EXPORT H264POC {
public:
H264POC();
~H264POC();
// Compute the picture order count for a slice, storing the result into
// |*pic_order_cnt|.
bool ComputePicOrderCnt(
const H264SPS* sps,
const H264SliceHeader& slice_hdr,
int32_t* pic_order_cnt);
// Reset computation state. It's best (although not strictly required) to call
// this after a seek.
void Reset();
private:
int32_t ref_pic_order_cnt_msb_;
int32_t ref_pic_order_cnt_lsb_;
int32_t prev_frame_num_;
int32_t prev_frame_num_offset_;
DISALLOW_COPY_AND_ASSIGN(H264POC);
};
} // namespace media
#endif // MEDIA_VIDEO_H264_POC_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file contains macros and macro-like constructs (e.g., templates) that
// are commonly used throughout Chromium source. (It may also contain things
// that are closely related to things that are commonly used that belong in this
// file.)
#ifndef BASE_MACROS_H_
#define BASE_MACROS_H_
#include <stddef.h> // For size_t.
// Put this in the declarations for a class to be uncopyable.
#define DISALLOW_COPY(TypeName) \
TypeName(const TypeName&) = delete
// Put this in the declarations for a class to be unassignable.
#define DISALLOW_ASSIGN(TypeName) \
void operator=(const TypeName&) = delete
// A macro to disallow the copy constructor and operator= functions.
// This should be used in the private: declarations for a class.
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
void operator=(const TypeName&) = delete
// A macro to disallow all the implicit constructors, namely the
// default constructor, copy constructor and operator= functions.
//
// This should be used in the private: declarations for a class
// that wants to prevent anyone from instantiating it. This is
// especially useful for classes containing only static methods.
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
TypeName() = delete; \
DISALLOW_COPY_AND_ASSIGN(TypeName)
// The arraysize(arr) macro returns the # of elements in an array arr. The
// expression is a compile-time constant, and therefore can be used in defining
// new arrays, for example. If you use arraysize on a pointer by mistake, you
// will get a compile-time error. For the technical details, refer to
// http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx.
// This template function declaration is used in defining arraysize.
// Note that the function doesn't need an implementation, as we only
// use its type.
template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
// Used to explicitly mark the return value of a function as unused. If you are
// really sure you don't want to do anything with the return value of a function
// that has been marked WARN_UNUSED_RESULT, wrap it with this. Example:
//
// std::unique_ptr<MyType> my_var = ...;
// if (TakeOwnership(my_var.get()) == SUCCESS)
// ignore_result(my_var.release());
//
template<typename T>
inline void ignore_result(const T&) {
}
// The following enum should be used only as a constructor argument to indicate
// that the variable has static storage class, and that the constructor should
// do nothing to its state. It indicates to the reader that it is legal to
// declare a static instance of the class, provided the constructor is given
// the base::LINKER_INITIALIZED argument. Normally, it is unsafe to declare a
// static variable that has a constructor or a destructor because invocation
// order is undefined. However, IF the type can be initialized by filling with
// zeroes (which the loader does for static variables), AND the destructor also
// does nothing to the storage, AND there are no virtual methods, then a
// constructor declared as
// explicit MyClass(base::LinkerInitialized x) {}
// and invoked as
// static MyClass my_variable_name(base::LINKER_INITIALIZED);
namespace base {
enum LinkerInitialized { LINKER_INITIALIZED };
// Use these to declare and define a static local variable (static T;) so that
// it is leaked so that its destructors are not called at exit. If you need
// thread-safe initialization, use base/lazy_instance.h instead.
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
static type& name = *new type arguments
} // base
#define MEDIA_EXPORT
#include <assert.h>
#include "Util/logger.h"
using namespace toolkit;
#define DCHECK(x) if(!(x)) { ErrorL << "DCHECK " << #x <<endl; }
#define DCHECK_GT(x,y) if(!((x) > (y))) { ErrorL << "DCHECK_GT:" << #x << #y << endl; }
#define DCHECK_GE(x,y) if(!((x) >= (y))) { ErrorL << "DCHECK_GE:" << #x << #y << endl; }
#define DCHECK_LT(x,y) if(!((x) < (y))) { ErrorL << "DCHECK_LT:" << #x << #y << endl; }
#define NOTREACHED() ErrorL << "NOTREACHED" << endl;
#endif // BASE_MACROS_H_
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_BASE_RANGES_H_
#define MEDIA_BASE_RANGES_H_
#include <stddef.h>
#include <stdint.h>
#include <algorithm>
#include <ostream>
#include <vector>
using namespace std;
namespace media {
// Ranges allows holding an ordered list of ranges of [start,end) intervals.
// The canonical example use-case is holding the list of ranges of buffered
// bytes or times in a <video> tag.
template <typename T> // Endpoint type; typically a base::TimeDelta or an int64_t.
class Ranges {
public:
// Allow copy & assign.
// Add (start,end) to this object, coallescing overlaps as appropriate.
// Returns the number of stored ranges, post coallescing.
size_t Add(T start, T end);
// Return the number of disjoint ranges.
size_t size() const;
// Return the "i"'th range's start & end (0-based).
T start(size_t i) const;
T end(size_t i) const;
// Clear all ranges.
void clear();
// Computes the intersection between this range and |other|.
Ranges<T> IntersectionWith(const Ranges<T>& other) const;
private:
// Wrapper around DCHECK_LT allowing comparisons of operator<<'able T's.
void DCheckLT(const T& lhs, const T& rhs) const;
// Disjoint, in increasing order of start.
std::vector<std::pair<T, T> > ranges_;
};
//////////////////////////////////////////////////////////////////////
// EVERYTHING BELOW HERE IS IMPLEMENTATION DETAIL!!
//////////////////////////////////////////////////////////////////////
template<class T>
size_t Ranges<T>::Add(T start, T end) {
if (start == end) // Nothing to be done with empty ranges.
return ranges_.size();
//DCheckLT(start, end);
size_t i;
// Walk along the array of ranges until |start| is no longer larger than the
// current interval's end.
for (i = 0; i < ranges_.size() && ranges_[i].second < start; ++i) {
// Empty body
}
// Now we know |start| belongs in the i'th slot.
// If i is the end of the range, append new range and done.
if (i == ranges_.size()) {
ranges_.push_back(std::make_pair(start, end));
return ranges_.size();
}
// If |end| is less than i->first, then [start,end) is a new (non-overlapping)
// i'th entry pushing everyone else back, and done.
if (end < ranges_[i].first) {
ranges_.insert(ranges_.begin() + i, std::make_pair(start, end));
return ranges_.size();
}
// Easy cases done. Getting here means there is overlap between [start,end)
// and the existing ranges.
// Now: start <= i->second && i->first <= end
if (start < ranges_[i].first)
ranges_[i].first = start;
if (ranges_[i].second < end)
ranges_[i].second = end;
// Now: [start,end) is contained in the i'th range, and we'd be done, except
// for the fact that the newly-extended i'th range might now overlap
// subsequent ranges. Merge until discontinuities appear. Note that there's
// no need to test/merge previous ranges, since needing that would mean the
// original loop went too far.
while ((i + 1) < ranges_.size() &&
ranges_[i + 1].first <= ranges_[i].second) {
ranges_[i].second = max(ranges_[i].second, ranges_[i + 1].second);
ranges_.erase(ranges_.begin() + i + 1);
}
return ranges_.size();
}
template<class T>
size_t Ranges<T>::size() const {
return ranges_.size();
}
template<class T>
T Ranges<T>::start(size_t i) const {
return ranges_[i].first;
}
template<class T>
T Ranges<T>::end(size_t i) const {
return ranges_[i].second;
}
template<class T>
void Ranges<T>::clear() {
ranges_.clear();
}
template<class T>
Ranges<T> Ranges<T>::IntersectionWith(const Ranges<T>& other) const {
Ranges<T> result;
size_t i = 0;
size_t j = 0;
while (i < size() && j < other.size()) {
T max_start = max(start(i), other.start(j));
T min_end = min(end(i), other.end(j));
// Add an intersection range to the result if the ranges overlap.
if (max_start < min_end)
result.Add(max_start, min_end);
if (end(i) < other.end(j))
++i;
else
++j;
}
return result;
}
} // namespace media
#endif // MEDIA_BASE_RANGES_H_
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
```
src
|
|-- Codec # 编码模块
| |-- AACEncoder.cpp # 对libfaac的封装
| |-- AACEncoder.h
| |-- H264Encoder.cpp # 对libx264的封装
| |-- H264Encoder.h
|
|-- Common # 杂项,一般文件
| |-- config.cpp # 主要功能是生成默认配置
| |-- config.h # 定义了一些宏、广播名常量、配置名常量
| |-- MediaSender.h # 一条专门的后台线程用来发送RTP、RTMP包
|
|-- Device # 原本这个文件夹是拿来做各种IPC(海康/大华/汉邦)适配的
| |-- base64.cpp # base64编解码
| |-- base64.h
| |-- Device.cpp # 输入YUV+PCM或H264+AAC生成流媒体源(rtmp/rtsp/hls/mp4)。
| |-- Device.h
| |-- PlayerProxy.cpp # 拉取rtsp/rtmp流生成流媒体源(rtmp/rtsp/hls/mp4)。
| |-- PlayerProxy.h
|
|-- H264 # H264帧处理代码,包括SPS/PPS的解析,POC计算等
| |-- h264_bit_reader.cpp # 移植于chrome
| |-- h264_bit_reader.h # 移植于chrome
| |-- h264_parser.cpp # 移植于chrome
| |-- h264_parser.h # 移植于chrome
| |-- h264_poc.cpp # 移植于chrome
| |-- h264_poc.h # 移植于chrome
| |-- macros.h # 移植于chrome
| |-- ranges.h # 移植于chrome
| |-- H264Parser.cpp # H264的POC、pts计算等
| |-- H264Parser.h
| |-- SPSParser.c # 移植于FFmpeg的sps/pps解析代码
| |-- SPSParser.h
|
|-- Http # Http[s]的服务器和客户端实现
| |-- HttpClient.cpp # Http客户端,可复用
| |-- HttpClient.h
| |-- HttpClientImp.cpp # Https客户端,派生于HttpClient
| |-- HttpClientImp.h
| |-- HttpDownloader.cpp # Http[s]文件下载器,支持断点续传
| |-- HttpDownloader.h
| |-- HttpRequester.cpp # 实现Http[s]API接口客户端,派生于HttpClientImp
| |-- HttpRequester.h
| |-- HttpSession.cpp # Http服务器,支持GET/POST命令。GET只能用于文件下载
| |-- HttpSession.h
| |-- HttpsSession.h # https服务器,派生于HttpSession
| |-- strCoding.cpp # http url转义和反转义
| |-- strCoding.h
|
|-- MediaFile # 媒体文件相关,包括mp4文件的读写,hls文件的生成
| |-- crc32.cpp # crc32计算,用于ts文件生成
| |-- crc32.h
| |-- HLSMaker.cpp # HLS文件生成,包括m3u8和ts文件生成
| |-- HLSMaker.h
| |-- MediaReader.cpp # mp4文件(只支持h264+aac)解析,转换成流媒体
| |-- MediaReader.h
| |-- MediaRecorder.cpp # 录制流媒体为mp4和hls
| |-- MediaRecorder.h
| |-- Mp4Maker.cpp # mp4文件生成,只支持h264+aac
| |-- Mp4Maker.h
| |-- TSMaker.cpp # ts文件生成,只支持h264+aac
| |-- TSMaker.h
|
|-- Player # 播放器
| |-- MediaPlayer.cpp # rtsp/rtmp播放器,只支持h264+acc
| |-- MediaPlayer.h
| |-- Player.cpp # 播放器音视频帧定义以及一些h264/aac处理工具函数
| |-- Player.h
| |-- PlayerBase.cpp
| |-- PlayerBase.h # 播放器基类,定义了一些虚函数
|
|-- Rtmp # rtmp协议支持
| |-- amf.cpp # amf格式的解析及编码
| |-- amf.h
| |-- Rtmp.h # rtmp包定义以及一些rtmp常量宏定义
| |-- RtmpMediaSource.cpp # rtmp流媒体源
| |-- RtmpMediaSource.h
| |-- RtmpParser.cpp # 解析rtmp媒体格式以及提取h264+aac
| |-- RtmpParser.h
| |-- RtmpPlayer.cpp # rtmp播放器
| |-- RtmpPlayer.h
| |-- RtmpPlayerImp.cpp # 派生于RtmpPlayer,结合RtmpParser
| |-- RtmpPlayerImp.h
| |-- RtmpProtocol.cpp # rtmp包序列化以及反序列化
| |-- RtmpProtocol.h
| |-- RtmpPusher.cpp # rtmp推流客户端
| |-- RtmpPusher.h
| |-- RtmpSession.cpp # rtmp服务器,支持播放及推流协议
| |-- RtmpSession.h
| |-- RtmpToRtspMediaSource.cpp # rtmp转rtsp实现
| |-- RtmpToRtspMediaSource.h
| |-- utils.cpp # 网络字节序与整形间的互转
| |-- utils.h
|
|-- RTP # RTP打包
| |-- RtpMaker.h # 打包类基类
| |-- RtpMakerAAC.cpp # aac的rtp打包实现
| |-- RtpMakerAAC.h
| |-- RtpMakerH264.cpp # h264的rtp打包实现
| |-- RtpMakerH264.h
|
|-- Rtsp # rtsp协议支持
| |-- RtpBroadCaster.cpp # rtp组播实现
| |-- RtpBroadCaster.h
| |-- RtpParser.cpp # 完成SDP解析以及rtp组包(提取h264+aac)
| |-- RtpParser.h
| |-- Rtsp.cpp # 定义了rtsp里面一些基本的方法及对象
| |-- Rtsp.h
| |-- RtspMediaSource.cpp # rtsp媒体源
| |-- RtspMediaSource.h
| |-- RtspPlayer.cpp # rtsp播放器实现
| |-- RtspPlayer.h
| |-- RtspPlayerImp.cpp # 派生于RtspPlayer,结合了RtpParser
| |-- RtspPlayerImp.h
| |-- RtspSession.cpp # rtsp服务器协议实现
| |-- RtspSession.h
| |-- RtspToRtmpMediaSource.cpp
| |-- RtspToRtmpMediaSource.h # rtsp转rtmp实现
| |-- UDPServer.cpp
| |-- UDPServer.h # udp端口分配器,用来实现rtp over udp
|
|-- Shell # 远程shell实现,可以实现简单的远程调试
| |-- CMD.cpp # 抽象了一些shell命令,可以简单的添加命令
| |-- CMD.h
| |-- ShellSession.cpp # shell会话类
| |-- ShellSession.h
|
|-- win32 # windows下命令行解析工具(unix下自带)
|-- getopt.c
|-- getopt.h
|-- tailor.h
```
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
/*
* MIT License
*
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
* Copyright (c) 2016-2019 xiongziliang <771730766@qq.com>
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论