📄 umc_avs_sequence_header.cpp
字号:
/*
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 2007 Intel Corporation. All Rights Reserved.
//
//
*/
#include "umc_defs.h"
#if defined(UMC_ENABLE_AVS_SPLITTER) || defined(UMC_ENABLE_AVS_VIDEO_DECODER)
#include "umc_avs_sequence_header.h"
#include "umc_avs_dec_byte_stream.h"
namespace UMC
{
static
double AVSFrameRates[16] =
{
15.0,
23.976,
24.0,
25.0,
29.97,
30.0,
50.0,
59.94,
60.0,
16.0,
17.0,
18.0,
19.0,
20.0,
21.0,
22.0
};
Status DecodeAVSSequenceHeader(AVS_SEQUENCE_HEADER *pSeqHeader,
Ipp8u *pbSrc,
size_t srcSize)
{
AVS_SEQUENCE_HEADER seqHeader;
AVSByteStream byteStream;
Status umcRes;
Ipp32s iTemp;
// the sequence header occupies exactly 18 bytes.
if (18 > srcSize)
return UMC_ERR_INVALID_STREAM;
// initialize the byte stream
umcRes = byteStream.Init(pbSrc, srcSize);
if (UMC_OK != umcRes)
return umcRes;
// skipping start code
byteStream.SkipBits(24);
// read information
seqHeader.video_sequence_start_code = byteStream.GetBits(8);
seqHeader.profile_id = byteStream.GetBits(8);
seqHeader.level_id = byteStream.GetBits(8);
seqHeader.progressive_sequence = byteStream.GetBit();
seqHeader.horizontal_size = byteStream.GetBits(14);
seqHeader.vertical_size = byteStream.GetBits(14);
seqHeader.chroma_format = byteStream.GetBits(2);
seqHeader.sample_precission = byteStream.GetBits(3);
seqHeader.aspect_ratio = byteStream.GetBits(4);
iTemp = byteStream.GetBits(4);
seqHeader.frame_rate = AVSFrameRates[iTemp];
seqHeader.bit_rate_lower = byteStream.GetBits(18);
byteStream.SkipBits(1);
seqHeader.bit_rate_upper = byteStream.GetBits(12);
seqHeader.low_delay = byteStream.GetBit();
byteStream.SkipBits(1);
seqHeader.bbv_buffer_size = byteStream.GetBits(18);
byteStream.SkipBits(3);
// check error(s)
if (UMC_OK != byteStream.Close())
return UMC_ERR_FAILED;
if (0x0b0 != seqHeader.video_sequence_start_code)
return UMC_ERR_INVALID_STREAM;
if (0 == seqHeader.profile_id)
return UMC_ERR_INVALID_STREAM;
if (0 == seqHeader.level_id)
return UMC_ERR_INVALID_STREAM;
if (0 == seqHeader.sample_precission)
return UMC_ERR_INVALID_STREAM;
if (0 == seqHeader.aspect_ratio)
return UMC_ERR_INVALID_STREAM;
// copy decoded header
*pSeqHeader = seqHeader;
return UMC_OK;
} // Status DecodeAVSSequenceHeader(AVS_SEQUENCE_HEADER *pSeqHeader,
} // namespace UMC
#endif // #if defined(UMC_ENABLE_AVS_SPLITTER) || defined(UMC_ENABLE_AVS_VIDEO_DECODER)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -