⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_avs_sequence_header.cpp

📁 audio-video-codecs.rar语音编解码器
💻 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 + -