AVCodeDecoder.cpp
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:3k
源码类别:

Audio

开发平台:

Visual C++

  1. //#include "stdfx.h"
  2. #include "h264.h"
  3. int FindStartCode (unsigned char *Buf, int zeros_in_startcode)
  4. {
  5.   int info;
  6.   int i;
  7.   info = 1;
  8.   for (i = 0; i < zeros_in_startcode; i++)
  9.     if(Buf[i] != 0)
  10.       info = 0;
  11.   if(Buf[i] != 1)
  12.     info = 0;
  13.   return info;
  14. }
  15. int getNextNal(FILE* inpf, unsigned char* Buf)
  16. {
  17. int pos = 0;
  18. while(!feof(inpf) && (Buf[pos++]=fgetc(inpf))==0);
  19. int StartCodeFound = 0;
  20. int info2 = 0;
  21. int info3 = 0;
  22. while (!StartCodeFound)
  23. {
  24. if (feof (inpf))
  25. {
  26. // return -1;
  27. return pos-1;
  28. }
  29. Buf[pos++] = fgetc (inpf);
  30. info3 = FindStartCode(&Buf[pos-4], 3);
  31. if(info3 != 1)
  32. info2 = FindStartCode(&Buf[pos-3], 2);
  33. StartCodeFound = (info2 == 1 || info3 == 1);
  34. }
  35. fseek (inpf, -4, SEEK_CUR);
  36. return pos - 4;
  37. }
  38. void pgm_save(unsigned char *buf,int wrap, int xsize,int ysize,char *filename) 
  39. {
  40.     FILE *f;
  41.     int i;
  42.     f=fopen(filename,"w");
  43.     fprintf(f,"P5n%d %dn%dn",xsize,ysize,255);
  44.     for(i=0;i<ysize;i++)
  45.         fwrite(buf + i * wrap,1,xsize,f);
  46.     fclose(f);
  47. }
  48. int main()
  49. {
  50. FILE * inpf;
  51. FILE * outf;
  52. int nWrite;
  53. int i;
  54. char outfile[] = "test.pgm";
  55. inpf = fopen("test.264", "rb");
  56. outf = fopen("out.yuv", "wb");
  57. int nalLen = 0;
  58. unsigned char* Buf = (unsigned char*)calloc ( 1000000, sizeof(char));
  59. // int width = 352;
  60. // int height = 288;
  61. AVCodec *codec;   // Codec
  62.     AVCodecContext *c;   // Codec Context
  63.     AVFrame *picture;   // Frame
  64. avcodec_init(); 
  65. avcodec_register_all(); 
  66. codec = avcodec_find_decoder(CODEC_ID_H264);
  67. if (!codec)  {
  68. return 0; 
  69. //allocate codec context
  70.     c = avcodec_alloc_context(); 
  71. if(!c){
  72. return 0;
  73. }
  74. //open codec
  75.     if (avcodec_open(c, codec) < 0) {
  76. return 0; 
  77. //allocate frame buffer
  78.     picture   = avcodec_alloc_frame();
  79. if(!picture){
  80. return 0;
  81. }
  82. while(!feof(inpf))
  83. {
  84. nalLen = getNextNal(inpf, Buf);
  85. //try to decode this frame
  86. int  got_picture, consumed_bytes; 
  87. consumed_bytes= decode_frame(c, picture, &got_picture, Buf, nalLen); 
  88. if (*got_picture)                           
  89.        avctx->frame_number++;
  90. if(consumed_bytes > 0)
  91. {
  92. //CS by tiany for test
  93. for(i=0; i<c->height; i++)
  94. fwrite(picture->data[0] + i * picture->linesize[0], 1, c->width, outf);
  95. for(i=0; i<c->height/2; i++)
  96. fwrite(picture->data[1] + i * picture->linesize[1], 1, c->width/2, outf);
  97. for(i=0; i<c->height/2; i++)
  98. fwrite(picture->data[2] + i * picture->linesize[2], 1, c->width/2, outf);
  99. // pgm_save(picture->data[0], picture->linesize[0], 
  100. // c->width, c->height, outfile);
  101. // pgm_save(picture->data[1], picture->linesize[1], 
  102. // c->width/2, c->height/2, outfile);
  103. // pgm_save(picture->data[2], picture->linesize[2], 
  104. // c->width/2, c->height/2, outfile);
  105. //CE by tiany for test
  106. }
  107. }
  108. if(inpf)
  109. fclose(inpf);
  110. if(outf)
  111. fclose(outf);
  112. if(c) {
  113. avcodec_close(c); 
  114. av_free(c);
  115. c = NULL;
  116. if(picture) {
  117. av_free(picture);
  118. picture = NULL;
  119. }
  120. if(Buf)
  121. {
  122. free(Buf);
  123. Buf = NULL;
  124. }
  125. return 1;
  126. }