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

📄 h263stream.c

📁 audio-video-codecs.rar语音编解码器
💻 C
字号:
/* ///////////////////////////////////////////////////////////////////////
//
//               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) 2005-2007 Intel Corporation. All Rights Reserved.
//
//  Description:    Decodes H.263++ bitstream.
//
*/

#include "h263.h"

/*
//  calculate number of bytes in buffer
*/
Ipp32s h263_RemainStream(h263_Info* pInfo)
{
   return pInfo->buflen - (pInfo->bufptr - pInfo->buffer);
}

#ifndef H263_USE_INLINE_BITS_FUNC

Ipp32u h263_ShowBits(h263_Info* pInfo, Ipp32s n)
{
    Ipp8u* ptr = pInfo->bufptr;
    Ipp32u tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp <<= pInfo->bitoff;
    tmp >>= 32 - n;
    return tmp;
}

Ipp32u h263_ShowBit(h263_Info* pInfo)
{
    Ipp32u tmp = pInfo->bufptr[0];
    tmp >>= 7 - pInfo->bitoff;
    return (tmp & 1);
}

Ipp32u h263_ShowBits9(h263_Info* pInfo, Ipp32s n)
{
    Ipp8u* ptr = pInfo->bufptr;
    Ipp32u tmp = (ptr[0] <<  8) | ptr[1];
    tmp <<= (pInfo->bitoff + 16);
    tmp >>= 32 - n;
    return tmp;
}

void h263_FlushBits(h263_Info* pInfo, Ipp32s n)
{
    n = n + pInfo->bitoff;
    pInfo->bufptr += n >> 3;
    pInfo->bitoff = n & 7;
}

Ipp32u h263_GetBits(h263_Info* pInfo, Ipp32s n)
{
    Ipp8u* ptr = pInfo->bufptr;
    Ipp32u tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp <<= pInfo->bitoff;
    tmp >>= 32 - n;
    n = n + pInfo->bitoff;
    pInfo->bufptr += n >> 3;
    pInfo->bitoff = n & 7;
    return tmp;
}

Ipp32u h263_GetBits9(h263_Info* pInfo, Ipp32s n)
{
    Ipp8u* ptr = pInfo->bufptr;
    Ipp32u tmp = (ptr[0] << 8) | ptr[1];
    tmp <<= (pInfo->bitoff + 16);
    tmp >>= 32 - n;
    n = n + pInfo->bitoff;
    pInfo->bufptr += n >> 3;
    pInfo->bitoff = n & 7;
    return tmp;
}

/*
//  align bit stream to the byte boundary
*/
void h263_AlignBits(h263_Info* pInfo)
{
    if (pInfo->bitoff > 0) {
        pInfo->bitoff = 0;
        (pInfo->bufptr)++;
    }
}

Ipp32u h263_ShowBitsAlign(h263_Info* pInfo, Ipp32s n)
{
    Ipp8u* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
    Ipp32u tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp >>= 32 - n;
    return tmp;
}

#endif

/*
//  check next bits are resync marker
*/

/* Ipp32s h263_CheckResyncMarker(h263_Info* pInfo, Ipp32s rml)
{
    // check zero bit
    if (h263_ShowBit(pInfo) != 0)
        return 0;
    // check stuffing bits
    if (h263_ShowBits9(pInfo, 8 - pInfo->bitoff) != (Ipp32u)((1 << (7 - pInfo->bitoff)) - 1))
        return 0;
    {
        Ipp8u* ptr = pInfo->bufptr + 1;
        Ipp32u tmp;
        tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
        tmp >>= 32 - rml;
        return (tmp == 1);
    }
}
*/

/*
//  find H.263 start code in buffer
*/
Ipp8u* h263_FindStartCodePtr(h263_Info* pInfo)
{
    Ipp32s  i, len = h263_RemainStream(pInfo);
    Ipp8u*  ptr = pInfo->bufptr;
    for (i = 0; i < len - 3; i++) {
        if (ptr[i] == 0 && ptr[i + 1] == 0 && (ptr[i + 2] & 0xFC) == 0x80) {
            return ptr + i;
        }
    }
    return NULL;
}

/*
//  find picture start code in the stream
*/
Ipp32s h263_SeekStartCodePtr(h263_Info* pInfo)
{
    Ipp8u* ptr;

    if (pInfo->bitoff) {
        pInfo->bufptr ++;
        pInfo->bitoff = 0;
    }
    ptr = h263_FindStartCodePtr(pInfo);
    if (ptr) {
        pInfo->bufptr = ptr;
        return 1;
    } else {
        pInfo->bufptr = pInfo->buffer + pInfo->buflen - 3;
        return 0;
    }
}

Ipp32s h263_SeekGOBStartCodePtr(h263_Info* pInfo)
{
  for (; pInfo->bufptr < pInfo->buffer + pInfo->buflen - 2; pInfo->bufptr++) {
    if (pInfo->bufptr[0] == 0) {
      pInfo->bitoff = 0;
      if (pInfo->bufptr[0] == 0 && pInfo->bufptr[1] == 0 && (pInfo->bufptr[2] & 0xFC) == 0x80)
        return 0;
      pInfo->bufptr--;
      for (pInfo->bitoff = 1; pInfo->bitoff <= 7; pInfo->bitoff++) {
        if (h263_ShowBits(pInfo, 17) == 1)
          return 1;
      }
      pInfo->bufptr ++;
      for (pInfo->bitoff = 0; pInfo->bitoff <= 7; pInfo->bitoff++) {
        if (h263_ShowBits(pInfo, 17) == 1)
          return 1;
      }
      pInfo->bufptr ++;
    }
  }
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -