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

流媒体/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. 2000-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "mp4live.h"
  22. #include "video_h26l.h"
  23. CH26LVideoEncoder::CH26LVideoEncoder()
  24. {
  25. m_vopBuffer = NULL;
  26. m_vopBufferLength = 0;
  27. }
  28. static char* H26LStaticConfig = 
  29. "InputHeaderLength     = 0      # If the inputfile has a header, state it's length in byte heren"
  30. "TRModulus             = 256 # Modulus for TR, not yet used, MUST be 256n"
  31. "PicIdModulus          = 256 # Modulus for the PictureID (used for RPS), not yet used, MUST be 256n"
  32. "FrameSkip            =  0  # Number of frames to be skipped in input (e.g 2 will code every third frame)n"
  33. "MVResolution         =  0  # Motion Vector Resolution: 0: 1/4-pel, 1: 1/8-peln"
  34. "UseHadamard          =  1  # Hadamard transform (0=not used, 1=used)n"
  35. "SearchRange          = 16  # Max search rangen"
  36. "NumberRefereceFrames =  2  # Number of previous frames used for inter motion search (1-5)n"
  37. "MbLineIntraUpdate    =  0  # Error robustness(extra intra macro block updates)(0=off, N: One GOB every N frames are intra coded)n"
  38. "InterSearch16x16     =  1  # Inter block search 16x16 (0=disable, 1=enable)n"
  39. "InterSearch16x8      =  1  # Inter block search 16x8  (0=disable, 1=enable)n"
  40. "InterSearch8x16      =  1  # Inter block search  8x16 (0=disable, 1=enable)n"
  41. "InterSearch8x8       =  1  # Inter block search  8x8  (0=disable, 1=enable)n"
  42. "InterSearch8x4       =  1  # Inter block search  8x4  (0=disable, 1=enable)n"
  43. "InterSearch4x8       =  1  # Inter block search  4x8  (0=disable, 1=enable)n"
  44. "InterSearch4x4       =  1  # Inter block search  4x4  (0=disable, 1=enable)n"
  45. "SliceMode            = 0   # Slice mode (0=off 1=fixed #mb in slice 2=fixed #bytes in slice 3=use callback)n"
  46. "SliceArgument        = 11  # Slice argument (Arguments to modes 1 and 2 above)n"
  47. "NumberBFrames        =  0  # Number of B frames inserted (0=not used)  n"
  48. "QPBPicture           = 17  # Quant. param for B frames (0-31)n"
  49. "SPPicturePeriodicity =  0  # SP-Picture Periodicity (0=not used)n"
  50. "QPSPPicture          = 16  # Quant. param of SP-Pictures for Prediction Error (0-31)n"
  51. "QPSP2Picture         = 15  # Quant. param of SP-Pictures for Predicted Blocks (0-31)n"
  52. "SymbolMode           =  0  # Symbol mode (Entropy coding method: 0=UVLC, 1=CABAC)n"
  53. "OutFileMode          =  0  # Output file mode, 0:Bitstream, 1:RTPn"
  54. "PartitionMode        =  0  # Partition Mode, 0: no DP, 1: 3 Partitions per Slice (3 Partitions not yet supported)n"
  55. "SequenceHeaderType   =  0  # Type of Sequence HeaderType (0:none, 1:MiniBinary)n"
  56. "RestrictSearchRange  =  0  # restriction for (0: blocks and ref, 1: ref, 2: no restrictions)n"
  57. "RDOptimization       =  1  # rd-optimized mode decision (0:off, 1:on, 2: with losses)n"
  58. "LossRate             = 10  # expected packet loss rate of the channel, only valid if RDOptimization = 2n"
  59. "NumberOfDecoders     = 30  # Numbers of decoders used to simulate the channel, only valid if RDOptimization = 2n"
  60. "UseConstrainedIntraPred  =  0  # If 1, Inter pixels are not used for Intra macroblock prediction.n"
  61. "LastFrameNumber          =  0  # Last frame number that have to be coded (0: no effect)n"
  62. "ChangeQPP                = 16  # QP (P-frame) for second part of sequencen"
  63. "ChangeQPB                = 18  # QP (B-frame) for second part of sequencen"
  64. "ChangeQPStart            =  0  # Frame no. for second part of sequence (0: no second part)n"
  65. "AdditionalReferenceFrame =  0  # Additional ref. frame to check (news_a: 16; news_b,c: 24)n"
  66. "NumberofLeakyBuckets     =  8                      # Number of Leaky Bucket valuesn"
  67. ;
  68. bool CH26LVideoEncoder::Init(CLiveConfig* pConfig, bool realTime)
  69. {
  70. m_pConfig = pConfig;
  71. // approximately relate desired bit rate to QP
  72. float ar = (float)(m_pConfig->m_videoWidth * m_pConfig->m_videoHeight) 
  73. / (176.0 * 144.0);
  74. float fps = m_pConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE);
  75. float br = (float)m_pConfig->GetIntegerValue(CONFIG_VIDEO_BIT_RATE);
  76. float b = 0.666667 * fps * ar;
  77. u_int8_t qp;
  78. for (qp = 30; qp > 0; qp--) {
  79. if (b >= br) {
  80. break;
  81. }
  82. b *= 1.135;
  83. }
  84. debug_message("H.26L QP %un", qp);
  85. u_int32_t keyFrameRate = (u_int32_t)
  86. (m_pConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE)
  87. * m_pConfig->GetFloatValue(CONFIG_VIDEO_KEY_FRAME_INTERVAL));
  88. if (keyFrameRate == 0) {
  89. keyFrameRate = 1;
  90. }
  91. char config[8*1024];
  92. snprintf(config, sizeof(config),
  93. "SourceWidth = %unSourceHeight = %un"
  94. "IntraPeriod = %un"
  95. "QPFirstFrame = %unQPRemainingFrame = %un"
  96. "%s",
  97. m_pConfig->m_videoWidth, m_pConfig->m_videoHeight,
  98. keyFrameRate,
  99. qp, qp + 1,
  100. H26LStaticConfig);
  101. return (H26L_Init(config) == 0);
  102. }
  103. bool CH26LVideoEncoder::EncodeImage(
  104. u_int8_t* pY, u_int8_t* pU, u_int8_t* pV, bool wantKeyFrame)
  105. {
  106. m_vopBuffer = (u_int8_t*)malloc(m_pConfig->m_videoMaxVopSize);
  107. if (m_vopBuffer == NULL) {
  108. return false;
  109. }
  110. H26L_Encode(pY, pU, pV, m_vopBuffer, (int*)&m_vopBufferLength);
  111. return true;
  112. }
  113. bool CH26LVideoEncoder::GetEncodedImage(
  114. u_int8_t** ppBuffer, u_int32_t* pBufferLength)
  115. {
  116. *ppBuffer = m_vopBuffer;
  117. *pBufferLength = m_vopBufferLength;
  118. m_vopBuffer = NULL;
  119. m_vopBufferLength = 0;
  120. return true;
  121. }
  122. bool CH26LVideoEncoder::GetReconstructedImage(
  123. u_int8_t* pY, u_int8_t* pU, u_int8_t* pV)
  124. {
  125. return (H26L_GetReconstructed(pY, pU, pV) == 0);
  126. }
  127. void CH26LVideoEncoder::Stop()
  128. {
  129. H26L_Close();
  130. }