webrtc_m130/sdk/android/src/java/org/webrtc/MediaCodecWrapper.java
Byoungchan Lee 0b06552ab3 Android: Respect input buffer layout of MediaFormat
On Android, MediaCodec can request a specific layout of the input buffer.
One can use the stride and slice height to calculate the layout from
the Encoder's MediaFormat. The current code assumes
a specific layout, which is a problematic in Android 12.
Fix this by honoring the stride and slice-height.

Bug: webrtc:13427
Change-Id: I2d3e429309e3add3ae668e0390460b51e6a49eb9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/240680
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
Cr-Commit-Position: refs/heads/main@{#36033}
2022-02-21 09:52:54 +00:00

56 lines
1.5 KiB
Java

/*
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
package org.webrtc;
import android.media.MediaCodec;
import android.media.MediaCrypto;
import android.media.MediaFormat;
import android.os.Bundle;
import android.view.Surface;
import java.nio.ByteBuffer;
/**
* Subset of methods defined in {@link android.media.MediaCodec} needed by
* {@link HardwareVideoEncoder} and {@link AndroidVideoDecoder}. This interface
* exists to allow mocking and using a fake implementation in tests.
*/
interface MediaCodecWrapper {
void configure(MediaFormat format, Surface surface, MediaCrypto crypto, int flags);
void start();
void flush();
void stop();
void release();
int dequeueInputBuffer(long timeoutUs);
void queueInputBuffer(int index, int offset, int size, long presentationTimeUs, int flags);
int dequeueOutputBuffer(MediaCodec.BufferInfo info, long timeoutUs);
void releaseOutputBuffer(int index, boolean render);
MediaFormat getInputFormat();
MediaFormat getOutputFormat();
ByteBuffer[] getInputBuffers();
ByteBuffer[] getOutputBuffers();
Surface createInputSurface();
void setParameters(Bundle params);
}