Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(495)

Unified Diff: webrtc/api/android/jni/androidmediaencoder_jni.cc

Issue 2538133002: Delete nalu parser in mediaencoder (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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";
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698