zhang007z 发表于 2013-5-25 18:28:43

求解,请版主急看,需要H264的全志编码库libh264enc.a的代码

由于本人正在做H264相关的程序,因为用查了相关的A10资料,知道A10提供H264的硬编码方式,之前测试用x264软方式在cubieboard上编码,cpu占用率98%,太高了,无法承受,所以需要用A10的硬编码方式,首先现在H264是主流的编码方式,经过我的寻找论坛上没有一个人用硬编码方式,这个让我很奇怪,首先主流的编码方式不用的话,这块会有技术瓶颈,根据全志A10的官方git,只提供了android和armel平台的这个libh264enc.a文件,但是由于cubieboard发现的保准版linux系统为linaro 1.1 是armhf平台的,所以无法使用这个库,而且因为android的视频方面的很多能力不支持,所以首先放弃android平台的的视频开发,那么因为官方的cubiebaord给的这个linaro 1.1还是非常稳定和强大的,所以还是喜欢在这个上边开发,但是苦于没有这个全志提供的H264的硬编码库很是郁闷,所以请各方搞视频的人注意了,首先希望版主联系官方全志获取这个库的代码,或者是armhf平带的这个库和头文件,否则很耽误视频开放方面的研究和进展!相关全志的代码请看:https://github.com/linux-sunxi/cedarx-libs/tree/master/libcedarv    没有对armhf平台很好的支持!

qiaoge 发表于 2013-5-27 09:25:36

晚看了,顶啊啊啊啊啊

cubieplayer 发表于 2013-5-27 14:30:10

LZ,等你贡献了,移植一下吧,让大家都用上

matson 发表于 2013-7-15 11:37:27

nand和cedarx都是allwinner较为封闭的2个东西,支持很有限的。

wsgtrsys 发表于 2014-2-23 21:16:19

int __fastcall H264EncOpen(struct_v10 **a1)
{
signed __int16 v2; // @2
unsigned int v3; // @5
struct_v10 **v4; // @1
unsigned int v5; // @7
signed int v6; // @13
signed int v7; // @7
signed int i; // @7
signed int j; // @13
struct_v10 *v10; // @1

v4 = a1;
v10 = *a1;
if ( *a1 )
{
    v10->dword120 = cedar_sys_phymalloc_map(0x800000, 1024);
    if ( v10->dword120 )
    {
      v10->dword124 = cedarv_address_vir2phy(v10->dword120);
      v10->dword128 = v10->dword124 + 0x7FFFFF;
      v10->dword130 = 0;
      v10->dword12C = 0;
      v10->wordB8 = 2;
      v10->wordBA = 2;
      v3 = v10->dword80;
      if ( v3 <= 0x14 && (1 << v3) & 0x160000 )
      {
      v10->word2 = v10->word7C;
      v10->word0 = v10->word7E;
      v10->byte4 &= 0xFCu;
      v10->byte4 &= 0xF3u;
      v10->byte4 &= 0x8Fu;
      v10->byte4 &= 0x7Fu;
      v10->byte5 = v10->byte1CD5 & 1 | v10->byte5 & 0xFE;
      v10->byte5 &= 0xFDu;
      v10->byte5 = 4 * (v10->byte1CD6 & 3) | v10->byte5 & 0xF3;
      v10->byte5 = 16 * (v10->byte1CD8 & 3) | v10->byte5 & 0xCF;
      v10->byte5 &= 0x3Fu;
      v10->byte6 = v10->dword1CDC & 0xF | v10->byte6 & 0xF0;
      v10->byte6 = 16 * (v10->dword1CE0 & 0xF) | v10->byte6 & 0xF;
      v10->byte7 &= 0x80u;
      v10->byte7 |= 0x80u;
      v10->byte8 = v10->dwordB0 & 0x3F | v10->byte8 & 0xC0;
      v10->byte8 &= 0x3Fu;
      v10->byte9 = v10->dwordB0 & 0x3F | v10->byte9 & 0xC0;
      v10->byte9 &= 0x3Fu;
      v10->byteA = v10->byte1CE4 & 7 | v10->byteA & 0xF8;
      *(_WORD *)&v10->byteA &= 7u;
      v10->byteC &= 0xFEu;
      v10->byteC = v10->byteC & 0xFD | 4;
      v10->byteC &= 0xF7u;
      v10->byteC &= 0xEFu;
      v10->byteC &= 0xDFu;
      v10->byteC &= 0x3Fu;
      v10->byteD |= 1u;
      *(_DWORD *)&v10->byteC &= 0x1FFu;
      v10->byte14 &= 0xF0u;
      v10->byte14 &= 0xFu;
      v10->byte15 &= 0xC0u;
      v10->byte15 &= 0x3Fu;
      v10->byte16 &= 0xFCu;
      *(_WORD *)&v10->byte16 &= 3u;
      v10->dword20 = 0;
      v5 = ((v10->dword74 + 31) & 0xFFFFFFE0) * ((v10->dword78 + 31) & 0xFFFFFFE0);
      v7 = (signed int)(((v10->dword74 + 31) & 0xFFFFFFE0) * ((v10->dword78 + 63) & 0xFFFFFFC0)) >> 1;
      for ( i = 0; v10->wordB8 > i; ++i )
      {
          *((_DWORD *)&v10->byte4 + i + 46) = cedar_sys_phymalloc_map(v5 + v7, 1024);
          if ( !*((_DWORD *)&v10->byte4 + i + 46) )
            return -3;
          *((_DWORD *)&v10->word0 + i + 52) = cedarv_address_vir2phy(*((_DWORD *)&v10->byte4 + i + 46));
          *((_DWORD *)&v10->byte4 + i + 56) = *((_DWORD *)&v10->word0 + i + 52) + v5;
      }
      v6 = (signed int)(((v10->dword74 + 63) & 0xFFFFFFC0) * ((v10->dword78 + 63) & 0xFFFFFFC0)) >> 2;
      for ( j = 0; v10->wordBA > j; ++j )
      {
          *((_DWORD *)&v10->word0 + j + 62) = cedar_sys_phymalloc_map(v6, 1024);
          if ( !*((_DWORD *)&v10->word0 + j + 62) )
            return -3;
          *((_DWORD *)&v10->byte4 + j + 66) = cedarv_address_vir2phy(*((_DWORD *)&v10->word0 + j + 62));
      }
      v10->dword134 = cedar_sys_phymalloc_map(2 * v10->dword74, 1024);
      if ( v10->dword134 )
      {
          v10->dword60 = cedarv_address_vir2phy(v10->dword134);
          v10->word64 = 1;
          v10->word66 = 1;
          rcInitSequence(v10);
          initPoc(v10);
          (*(void (__fastcall **)(struct_v10 *))&v4->byte4)(v4);
          v2 = 0;
      }
      else
      {
          v2 = -3;
      }
      }
      else
      {
      v2 = -1;
      }
    }
    else
    {
      v2 = -1;
    }
}
else
{
    v2 = -1;
}
return v2;
}

wsgtrsys 发表于 2014-2-23 21:17:21

int __fastcall H264EncIoCtrl(int a1, int a2, struct_a3 *a3)
{
signed __int16 v4; // @2
struct_v5_1 *v5; // @1

v5 = *(struct_v5_1 **)a1;
if ( *(_DWORD *)a1 )
{
    switch ( a2 )
    {
      case 3:
      if ( a3->dword0 )
      {
          if ( a3->dword0 == 1 )
            *(_DWORD *)(a1 + 36) = a3->dword4;
      }
      else
      {
          *(_DWORD *)(a1 + 32) = a3->dword4;
      }
      break;
      case 4:
      v5->word64 = 1;
      v5->word66 = 1;
      v5->dword68 = 0;
      v5->dwordB4 = 18;
      rcInitSequence(v5);
      initPoc(v5);
      break;
      case 2:
      v5->dword94 = a3->dwordC;
      v5->dword80 = a3->dword10;
      v5->dword84 = a3->dword14;
      v5->dwordA4 = a3->word1A;
      v5->dwordA0 = a3->word18;
      v5->dword90 = a3->dword1C;
      v5->dword6C = a3->dword4;
      v5->dword70 = a3->dword8;
      v5->dword74 = (v5->dword6C + 15) & 0xFFFFFFF0;
      v5->dword78 = (v5->dword70 + 15) & 0xFFFFFFF0;
      v5->word7C = v5->dword74 >> 4;
      v5->word7E = v5->dword78 >> 4;
      v5->dword88 = a3->dword20;
      break;
    }
    v4 = 0;
}
else
{
    v4 = -1;
}
return v4;
}

wsgtrsys 发表于 2014-2-23 21:18:08

void *__fastcall H264EncInit(int a1)
{
void *v2; // @2
struct_s *s; // @3
struct_v5_2 *v5; // @5
int v6; // @7

MACC_REGS_BASE = cedarv_get_macc_base_address();
if ( MACC_REGS_BASE )
{
    cedarv_reset_ve_core();
    *(_DWORD *)a1 = 0;
    s = (struct_s *)malloc(0x28u);
    if ( s )
    {
      memset(s, 0, 0x28u);
      v5 = (struct_v5_2 *)malloc(0x22E8u);
      if ( v5 )
      {
      memset(v5, 0, 0x22E8u);
      s->pvoid0 = v5;
      v6 = H264IspInit(a1);
      if ( v6 && *(_DWORD *)a1 != -1 )
      {
          s->dword4 = v6;
          s->dword8 = H264EncOpen;
          s->dwordC = H264EncClose;
          s->dword10 = H264EncEncode;
          s->dword14 = H264EncIoCtrl;
          s->dword18 = H264EncGetBsInfo;
          s->dword1C = H264EncReleaseBsInfo;
          v5->dword68 = 0;
          v5->dwordB4 = 18;
          v5->dword90 = 0x400000;
          v5->dword94 = 25;
          v5->dword88 = 25;
          v5->dword8C = 0;
          v5->byte1CE9 = 1;
          v5->dword9C = 1;
          v5->dwordA0 = 45;
          v5->dwordA4 = 10;
          v5->dwordA8 = 2;
          v5->dwordAC = 30;
          v5->dwordB0 = 30;
          v5->byte1CCC = 77;
          v5->byte1CCD = 41;
          v5->byte1CCE = 4;
          v5->byte1CCF = 8;
          v5->byte1CD4 = 0;
          v5->byte1CE7 = 1;
          v5->byte1CE8 = 1;
          v5->byte1CD5 = 1;
          v5->byte1CD6 = 1;
          v5->byte1CD7 = 0;
          v5->byte1CD8 = 0;
          v5->dword1CDC = 0;
          v5->dword1CE0 = 0;
          v5->byte1CE4 = 4;
          v5->byte1CE5 = 0;
          v2 = s;
      }
      else
      {
          free(s->pvoid0);
          free(s);
          v2 = 0;
      }
      }
      else
      {
      free(s);
      v2 = 0;
      }
    }
    else
    {
      v2 = 0;
    }
}
else
{
    v2 = 0;
}
return v2;
}

wsgtrsys 发表于 2014-2-23 21:22:04

int __fastcall H264EncEncode(struct_a1 *a1)
{
struct_v1 *v1; // ST5C_4@14
__int16 v2; // ST4A_2@14
struct_v3 *v3; // ST5C_4@15
int v4; // r1@29
int v5; // r2@44
char *v6; // r3@44
char *v7; // r2@45
struct_v1 *v8; // ST5C_4@54
int v9; // r1@68
int v10; // r2@83
char *v11; // r3@83
char *v12; // r2@84
signed __int16 v14; // @2
int v15; // @10
unsigned int v17; // @36
int v18; // @37
unsigned int v19; // @75
int v20; // @76
signed int i; // @15
signed int j; // @20
signed int k; // @54
signed int l; // @59
struct_v25 *v25; // @1
int v26; // @1

v25 = a1->pstruct_v250;
v26 = *(_DWORD *)a1->pstruct_v14;
MACC_REGS_BASE->dword0 = 11;
if ( v25 )
{
    pthread_mutex_lock((pthread_mutex_t *)&mutex_lock);
    if ( (unsigned int)v25->byte98A <= 0x7C && v25->dword12C <= 0x600000u )
    {
      pthread_mutex_unlock((pthread_mutex_t *)&mutex_lock);
      if ( !a1->pfunc20(0, &v25->gap134) )
      {
      if ( v25->dword14C )
      {
          v25->dword68 = 0;
          v25->dwordB4 = 18;
      }
      v25->dword22E0 = 0;
      v15 = v25->dword22E0;
      if ( v15 == 1 )
      {
          *(_BYTE *)(v26 + 4) |= 0x20u;
          v1 = a1->pstruct_v14;
          v1->pfuncC(a1->pstruct_v14, 2, v25);
          v1->pfuncC(v1, 8, (struct_v25 *)&v25->gap134);
          v1->pfuncC(v1, 3, (struct_v25 *)&v25->gap134);
          v1->pfuncC(v1, 5, (struct_v25 *)&v25->gap134);
          v2 = v1->pfunc10((int)v1);
      }
      else if ( v15 == 2 )
      {
          *(_BYTE *)(v26 + 4) |= 0x20u;
          v3 = (struct_v3 *)a1->pstruct_v14;
          v3->pfuncC((int)a1->pstruct_v14, 8, (struct_v25 *)&v25->gap134);
          v3->pfuncC((int)v3, 2, v25);
          v3->pfuncC((int)v3, 3, (struct_v25 *)&v25->gap134);
          v3->pfuncC((int)v3, 5, (struct_v25 *)&v25->gap134);
          for ( i = 0; v25->wordB8 > i; ++i )
          {
            if ( !v25->gap15C )
            {
            v25->byte17E = i;
            break;
            }
          }
          for ( j = 0; v25->wordBA > j; ++j )
          {
            if ( !v25->gap17F )
            {
            v25->byte185 = j;
            break;
            }
          }
          MACC_REGS_BASE->dwordB88 = 8 * v25->dword130;
          MACC_REGS_BASE->dwordB80 = v25->dword124;
          MACC_REGS_BASE->dwordB84 = v25->dword128;
          MACC_REGS_BASE->dwordB8C = 8 * (v25->dword130 - v25->dword12C + 0x800000);
          MACC_REGS_BASE->dwordBA0 = *(_DWORD *)&v25->gap0;
          MACC_REGS_BASE->dwordBA4 = *(&v25->dword4 + v25->byte17D + 56);
          MACC_REGS_BASE->dwordBB0 = *(_DWORD *)&v25->gap0;
          MACC_REGS_BASE->dwordBB4 = *(&v25->dword4 + v25->byte17E + 56);
          MACC_REGS_BASE->dwordBB8 = *(&v25->dword4 + v25->byte184 + 66);
          MACC_REGS_BASE->dwordBBC = *(&v25->dword4 + v25->byte185 + 66);
          if ( v25->dwordB4 == 18 )
            v25->byte1CEA = 2;
          else
            v25->byte1CEA = LOBYTE(v25->dwordB4);
          if ( v25->dwordB4 == 18 )
          {
            v4 = v25->dword1D00;
            if ( v4 < *(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25) )
            v4 = *(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25);
            v25->dword1D00 = v4;
            *(_DWORD *)((char *)&loc_1CFC + (_DWORD)v25) = *(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25);
          }
          getPoc(v25);
          rcInitPic(v25);
          if ( v25->word64 )
          {
            BYTE3(v25->dword4) |= 0x80u;
            MACC_REGS_BASE->dwordB04 = v25->dword4;
            v25->dword990 = InitSPS(a1);
            v25->dword994 = InitPPS(a1);
            v25->word64 = 0;
          }
          MACC_REGS_BASE->dwordB14 |= 0xFu;
          StartSlice(a1);
          if ( a1->pfunc24(0, 0) )
            return -2;
          g_ve_status = MACC_REGS_BASE->dwordB1C;
          MACC_REGS_BASE->dwordB1C = g_ve_status;
          v25->dword24 = MACC_REGS_BASE->dwordB50;
          v25->dword28 = MACC_REGS_BASE->dwordB54;
          v25->dword2C = MACC_REGS_BASE->dwordB58;
          v25->dword30 = MACC_REGS_BASE->dwordB5C;
          v17 = MACC_REGS_BASE->dwordB90 >> 3;
          if ( v25->dword130 > v17 )

wsgtrsys 发表于 2014-2-23 21:22:26


            v18 = v25->dword130 - v17;
          else
            v18 = v17 - v25->dword130;
          *(_DWORD *)((char *)&loc_1D14 + (_DWORD)v25) = v18;
          if ( v25->word66 == 1 )
            *(_DWORD *)((char *)&loc_1D14 + (_DWORD)v25) -= v25->dword990 + v25->dword994;
          *(_DWORD *)((char *)&loc_1D14 + (_DWORD)v25) *= 8;
          rcUpdatePic(v25);
          pthread_mutex_lock((pthread_mutex_t *)&mutex_lock);
          *(_DWORD *)&v25->gap0 = v25->dword130;
          *(_DWORD *)&v25->gap0 = v18;
          if ( v18 & 0x1F )
            v18 = v18 - (v18 & 0x1F) + 32;
          if ( v25->dword158 )
          {
            v5 = v25->dword154;
            v6 = &v25->gap0;
            *(_DWORD *)v6 = v25->dword150;
            *((_DWORD *)v6 + 1) = v5;
          }
          else
          {
            v7 = &v25->gap0;
            *(_DWORD *)v7 = -1;
            *((_DWORD *)v7 + 1) = -1;
          }
          v25->dword12C += v18;
          v25->dword130 += v18;
          if ( v25->dword130 > 0x7FFFFFu )
            v25->dword130 -= 0x800000;
          ++v25->byte989;
          if ( v25->byte989 == 128 )
            v25->byte989 = 0;
          ++v25->byte98A;
          ++v25->byte98B;
          pthread_mutex_unlock((pthread_mutex_t *)&mutex_lock);
          v25->gap15C = 0;
          v25->byte17D = v25->byte17E;
          v25->gap15C = 1;
          v25->gap17F = 0;
          v25->byte184 = v25->byte185;
          v25->gap17F = 1;
          ++v25->dword68;
          if ( v25->dword68 == v25->dword88 )
          {
            v25->dword68 = 0;
            v25->dwordB4 = 18;
          }
          else
          {
            v25->dwordB4 = 0;
          }
          ++*(_DWORD *)((char *)&loc_1D10 + (_DWORD)v25);
          *(_DWORD *)((char *)&loc_1D10 + (_DWORD)v25) &= (1 << v25->byte1CCE) - 1;
          ++*(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25);
      }
      else if ( !v15 )
      {
          *(_BYTE *)(v26 + 4) &= 0xDFu;
          v8 = a1->pstruct_v14;
          v8->pfuncC(a1->pstruct_v14, 8, (struct_v25 *)&v25->gap134);
          v8->pfuncC(v8, 2, v25);
          v8->pfuncC(v8, 3, (struct_v25 *)&v25->gap134);
          v8->pfuncC(v8, 5, (struct_v25 *)&v25->gap134);
          for ( k = 0; v25->wordB8 > k; ++k )
          {
            if ( !v25->gap15C )
            {
            v25->byte17E = k;
            break;
            }
          }
          for ( l = 0; v25->wordBA > l; ++l )
          {
            if ( !v25->gap17F )
            {
            v25->byte185 = l;
            break;
            }
          }
          MACC_REGS_BASE->dwordB88 = 8 * v25->dword130;
          MACC_REGS_BASE->dwordB80 = v25->dword124;
          MACC_REGS_BASE->dwordB84 = v25->dword128;
          MACC_REGS_BASE->dwordB8C = 8 * (v25->dword130 - v25->dword12C + 0x800000);
          MACC_REGS_BASE->dwordBA0 = *(_DWORD *)&v25->gap0;
          MACC_REGS_BASE->dwordBA4 = *(&v25->dword4 + v25->byte17D + 56);
          MACC_REGS_BASE->dwordBB0 = *(_DWORD *)&v25->gap0;
          MACC_REGS_BASE->dwordBB4 = *(&v25->dword4 + v25->byte17E + 56);
          MACC_REGS_BASE->dwordBB8 = *(&v25->dword4 + v25->byte184 + 66);
          MACC_REGS_BASE->dwordBBC = *(&v25->dword4 + v25->byte185 + 66);
          if ( v25->dwordB4 == 18 )
            v25->byte1CEA = 2;
          else
            v25->byte1CEA = LOBYTE(v25->dwordB4);
          if ( v25->dwordB4 == 18 )
          {
            v9 = v25->dword1D00;
            if ( v9 < *(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25) )
            v9 = *(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25);
            v25->dword1D00 = v9;
            *(_DWORD *)((char *)&loc_1CFC + (_DWORD)v25) = *(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25);
          }
          getPoc(v25);
          rcInitPic(v25);
          if ( v25->word64 )
          {
            BYTE3(v25->dword4) |= 0x80u;
            MACC_REGS_BASE->dwordB04 = v25->dword4;
            v25->dword990 = InitSPS(a1);
            v25->dword994 = InitPPS(a1);
            v25->word64 = 0;
          }
          MACC_REGS_BASE->dwordB14 |= 0xFu;
          StartSlice(a1);
          if ( a1->pfunc24(0, 0) )
            return -2;
          g_ve_status = MACC_REGS_BASE->dwordB1C;
          MACC_REGS_BASE->dwordB1C = g_ve_status;
          v25->dword24 = MACC_REGS_BASE->dwordB50;
          v25->dword28 = MACC_REGS_BASE->dwordB54;
          v25->dword2C = MACC_REGS_BASE->dwordB58;
          v25->dword30 = MACC_REGS_BASE->dwordB5C;
          v19 = MACC_REGS_BASE->dwordB90 >> 3;
          if ( v25->dword130 > v19 )
            v20 = v25->dword130 - v19;
          else
            v20 = v19 - v25->dword130;
          *(_DWORD *)((char *)&loc_1D14 + (_DWORD)v25) = v20;
          if ( v25->word66 == 1 )
            *(_DWORD *)((char *)&loc_1D14 + (_DWORD)v25) -= v25->dword990 + v25->dword994;
          *(_DWORD *)((char *)&loc_1D14 + (_DWORD)v25) *= 8;
          rcUpdatePic(v25);
          pthread_mutex_lock((pthread_mutex_t *)&mutex_lock);
          *(_DWORD *)&v25->gap0 = v25->dword130;
          *(_DWORD *)&v25->gap0 = v20;
          if ( v20 & 0x1F )
            v20 = v20 - (v20 & 0x1F) + 32;
          if ( v25->dword158 )
          {
            v10 = v25->dword154;
            v11 = &v25->gap0;
            *(_DWORD *)v11 = v25->dword150;
            *((_DWORD *)v11 + 1) = v10;
          }
          else
          {
            v12 = &v25->gap0;
            *(_DWORD *)v12 = -1;
            *((_DWORD *)v12 + 1) = -1;
          }
          v25->dword12C += v20;
          v25->dword130 += v20;
          if ( v25->dword130 > 0x7FFFFFu )
            v25->dword130 -= 0x800000;
          ++v25->byte989;
          if ( v25->byte989 == 128 )
            v25->byte989 = 0;
          ++v25->byte98A;
          ++v25->byte98B;
          pthread_mutex_unlock((pthread_mutex_t *)&mutex_lock);
          v25->gap15C = 0;
          v25->byte17D = v25->byte17E;
          v25->gap15C = 1;
          v25->gap17F = 0;
          v25->byte184 = v25->byte185;
          v25->gap17F = 1;
          ++v25->dword68;
          if ( v25->dword68 == v25->dword88 )
          {
            v25->dword68 = 0;
            v25->dwordB4 = 18;
          }
          else
          {
            v25->dwordB4 = 0;
          }
          ++*(_DWORD *)((char *)&loc_1D10 + (_DWORD)v25);
          *(_DWORD *)((char *)&loc_1D10 + (_DWORD)v25) &= (1 << v25->byte1CCE) - 1;
          ++*(_DWORD *)((char *)&loc_1CF8 + (_DWORD)v25);
      }
      return 0;
      }
      v14 = -1;
    }
    else
    {
      pthread_mutex_unlock((pthread_mutex_t *)&mutex_lock);
      v14 = -3;
    }
}
else
{
    v14 = -1;
}
return v14;
}

sunbeyond 发表于 2014-2-25 09:41:07

wsgtrsys 发表于 2014-2-23 21:22 static/image/common/back.gif


请问一下是支持armhf 平台的吗?
页: [1] 2
查看完整版本: 求解,请版主急看,需要H264的全志编码库libh264enc.a的代码