Index: webrtc/api/android/jni/androidmediaencoder_jni.cc |
diff --git a/webrtc/api/android/jni/androidmediaencoder_jni.cc b/webrtc/api/android/jni/androidmediaencoder_jni.cc |
index 8a7a72466581b3133dd547ab5b80aa27e6a2ce7e..ca624423429002bc35f13de19a09ce42351ed406 100644 |
--- a/webrtc/api/android/jni/androidmediaencoder_jni.cc |
+++ b/webrtc/api/android/jni/androidmediaencoder_jni.cc |
@@ -30,6 +30,7 @@ |
#include "webrtc/base/timeutils.h" |
#include "webrtc/common_types.h" |
#include "webrtc/common_video/h264/h264_bitstream_parser.h" |
+#include "webrtc/common_video/h264/h264_common.h" |
#include "webrtc/common_video/h264/profile_level_id.h" |
#include "webrtc/media/engine/internalencoderfactory.h" |
#include "webrtc/modules/video_coding/include/video_codec_interface.h" |
@@ -56,10 +57,6 @@ using webrtc::QualityScaler; |
namespace webrtc_jni { |
-// H.264 start code length. |
-#define H264_SC_LENGTH 4 |
-// Maximum allowed NALUs in one output frame. |
-#define MAX_NALUS_PERFRAME 32 |
// Maximum supported HW video encoder fps. |
#define MAX_VIDEO_FPS 30 |
// Maximum allowed fps value in SetRates() call. |
@@ -179,9 +176,6 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder, |
// true on success. |
bool DeliverPendingOutputs(JNIEnv* jni); |
- // Search for H.264 start codes. |
- int32_t NextNaluPosition(uint8_t *buffer, size_t buffer_size); |
- |
VideoEncoder::ScalingSettings GetScalingSettings() const override; |
// Displays encoder statistics. |
@@ -1101,20 +1095,9 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { |
image->qp_ = qp; |
} |
// For H.264 search for start codes. |
- int32_t scPositions[MAX_NALUS_PERFRAME + 1] = {}; |
- int32_t scPositionsLength = 0; |
- int32_t scPosition = 0; |
- while (scPositionsLength < MAX_NALUS_PERFRAME) { |
- int32_t naluPosition = NextNaluPosition( |
- payload + scPosition, payload_size - scPosition); |
- if (naluPosition < 0) { |
- break; |
- } |
- scPosition += naluPosition; |
- scPositions[scPositionsLength++] = scPosition; |
- scPosition += H264_SC_LENGTH; |
- } |
- if (scPositionsLength == 0) { |
+ const std::vector<webrtc::H264::NaluIndex> nalu_idxs = |
+ webrtc::H264::FindNaluIndices(payload, payload_size); |
+ if (nalu_idxs.empty()) { |
ALOGE << "Start code is not found!"; |
ALOGE << "Data:" << image->_buffer[0] << " " << image->_buffer[1] |
<< " " << image->_buffer[2] << " " << image->_buffer[3] |
@@ -1122,12 +1105,10 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { |
ProcessHWErrorOnCodecThread(true /* reset_if_fallback_unavailable */); |
return false; |
} |
- scPositions[scPositionsLength] = payload_size; |
- header.VerifyAndAllocateFragmentationHeader(scPositionsLength); |
- for (size_t i = 0; i < scPositionsLength; i++) { |
- header.fragmentationOffset[i] = scPositions[i] + H264_SC_LENGTH; |
- header.fragmentationLength[i] = |
- scPositions[i + 1] - header.fragmentationOffset[i]; |
+ header.VerifyAndAllocateFragmentationHeader(nalu_idxs.size()); |
+ for (size_t i = 0; i < nalu_idxs.size(); i++) { |
+ header.fragmentationOffset[i] = nalu_idxs[i].payload_start_offset; |
+ header.fragmentationLength[i] = nalu_idxs[i].payload_size; |
header.fragmentationPlType[i] = 0; |
header.fragmentationTimeDiff[i] = 0; |
} |
@@ -1204,38 +1185,6 @@ MediaCodecVideoEncoder::GetScalingSettings() const { |
return VideoEncoder::ScalingSettings(scale_); |
} |
-int32_t MediaCodecVideoEncoder::NextNaluPosition( |
- uint8_t *buffer, size_t buffer_size) { |
- if (buffer_size < H264_SC_LENGTH) { |
- return -1; |
- } |
- uint8_t *head = buffer; |
- // Set end buffer pointer to 4 bytes before actual buffer end so we can |
- // access head[1], head[2] and head[3] in a loop without buffer overrun. |
- uint8_t *end = buffer + buffer_size - H264_SC_LENGTH; |
- |
- while (head < end) { |
- if (head[0]) { |
- head++; |
- continue; |
- } |
- if (head[1]) { // got 00xx |
- head += 2; |
- continue; |
- } |
- if (head[2]) { // got 0000xx |
- head += 3; |
- continue; |
- } |
- if (head[3] != 0x01) { // got 000000xx |
- head++; // xx != 1, continue searching. |
- continue; |
- } |
- return (int32_t)(head - buffer); |
- } |
- return -1; |
-} |
- |
const char* MediaCodecVideoEncoder::ImplementationName() const { |
return "MediaCodec"; |
} |