mpeg3.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Bill May (wmay@cisco.com)
  20.  */
  21. #include "mpeg4ip.h"
  22. #include "mp4av.h"
  23. static double mpeg3_frame_rate_table[16] =
  24. {
  25.   0.0,   /* Pad */
  26.   24000.0/1001.0,       /* Official frame rates */
  27.   24.0,
  28.   25.0,
  29.   30000.0/1001.0,
  30.   30.0,
  31.   50.0,
  32.   ((60.0*1000.0)/1001.0),
  33.   60.0,
  34.   1,                    /* Unofficial economy rates */
  35.   5, 
  36.   10,
  37.   12,
  38.   15,
  39.   0,
  40.   0,
  41. };
  42. #define MPEG3_SEQUENCE_START_CODE        0x000001b3
  43. #define MPEG3_PICTURE_START_CODE         0x00000100
  44. #define MPEG3_GOP_START_CODE             0x000001b8
  45. extern "C" int MP4AV_Mpeg3ParseSeqHdr (uint8_t *pbuffer,
  46.        uint32_t buflen,
  47.        uint32_t *height,
  48.        uint32_t *width,
  49.        double *frame_rate)
  50. {
  51.   uint32_t framerate_code;
  52. #if 1
  53.   uint32_t value, ix;
  54.   buflen -= 6;
  55.   for (ix = 0; ix < buflen; ix++, pbuffer++) {
  56.     value = (pbuffer[0] << 24) | (pbuffer[1] << 16) | (pbuffer[2] << 8) | 
  57.       pbuffer[3];
  58.     if (value == MPEG3_SEQUENCE_START_CODE) {
  59.       pbuffer += sizeof(uint32_t);
  60.       *height = (pbuffer[0] << 4) | ((pbuffer[1] >> 4) &0xf);
  61.       *width = ((pbuffer[1] & 0xf) << 4) | pbuffer[2];
  62.       framerate_code = pbuffer[3] & 0xf;
  63.       *frame_rate = mpeg3_frame_rate_table[framerate_code];
  64.       return 0;
  65.     }
  66.   }
  67.   return -1;
  68. #else
  69.   // if you want to do the whole frame
  70.   int ix;
  71.   CBitstream bs(pbuffer, buflen);
  72.   
  73.   try {
  74.     while (bs.PeekBits(32) != MPEG3_SEQUENCE_START_CODE) {
  75.       bs.GetBits(8);
  76.     }
  77.     bs.GetBits(32); // start code
  78.     *height = bs.GetBits(12);
  79.     *width = bs.GetBits(12);
  80.     bs.GetBits(4);
  81.     framerate_code = bs.GetBits(4);
  82.     *frame_rate = mpeg3_frame_rate_table[framerate_code];
  83.     bs.GetBits(18); // bitrate
  84.     bs.GetBits(1);  // marker bit
  85.     bs.GetBits(10); // vbv buffer
  86.     bs.GetBits(1); // constrained params
  87.     if (bs.GetBits(1)) {  // intra_quantizer_matrix
  88.       for (ix = 0; ix < 64; ix++) {
  89. bs.GetBits(8);
  90.       }
  91.     }
  92.     if (bs.GetBits(1)) { // non_intra_quantizer_matrix
  93.       for (ix = 0; ix < 64; ix++) {
  94. bs.GetBits(8);
  95.       }
  96.     }
  97.   } catch (...) {
  98.     return false;
  99.   }
  100.   return true;
  101. #endif
  102. }
  103. extern "C" int MP4AV_Mpeg3PictHdrType (uint8_t *pbuffer)
  104. {
  105.   pbuffer += sizeof(uint32_t);
  106.   return ((pbuffer[1] >> 3) & 0x7);
  107. }
  108. extern "C" int MP4AV_Mpeg3FindGopOrPictHdr (uint8_t *pbuffer,
  109.     uint32_t buflen,
  110.     int *frame_type)
  111. {
  112.   uint32_t value;
  113.   uint32_t offset;
  114.   int ftype;
  115.   for (offset = 0; offset < buflen; offset++, pbuffer++) {
  116.     value = (pbuffer[0] << 24) | (pbuffer[1] << 16) | (pbuffer[2] << 8) | 
  117.       pbuffer[3];
  118.     if (value == MPEG3_PICTURE_START_CODE) {
  119.       ftype = MP4AV_Mpeg3PictHdrType(pbuffer);
  120.       if (frame_type != NULL) *frame_type = ftype;
  121.       if (ftype == 1) {
  122. return 0;
  123.       } else {
  124. return -1;
  125.       }
  126.     } else if (value == MPEG3_GOP_START_CODE) {
  127.       return 1;
  128.     }
  129.   }
  130.   return -1;
  131. }