Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ecfe4ec authored by Marco Nelissen's avatar Marco Nelissen Committed by Android Git Automerger
Browse files

am 92630351: Merge "NuPlayer: Use a software renderer when using software codecs"

* commit '92630351':
  NuPlayer: Use a software renderer when using software codecs
parents 616c2cf1 92630351
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@

#include "ATSParser.h"

#include "SoftwareRenderer.h"

#include <cutils/properties.h> // for property_get
#include <media/stagefright/foundation/hexdump.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -146,6 +148,7 @@ NuPlayer::NuPlayer()
    : mUIDValid(false),
      mSourceFlags(0),
      mVideoIsAVC(false),
      mNeedsSwRenderer(false),
      mAudioEOS(false),
      mVideoEOS(false),
      mScanSourcesPending(false),
@@ -444,6 +447,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
            ALOGV("kWhatStart");

            mVideoIsAVC = false;
            mNeedsSwRenderer = false;
            mAudioEOS = false;
            mVideoEOS = false;
            mSkipRenderingAudioUntilMediaTimeUs = -1;
@@ -680,6 +684,20 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {

                    notifyListener(
                            MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight);

                    if (mNeedsSwRenderer && mNativeWindow != NULL) {
                        int32_t colorFormat;
                        CHECK(codecRequest->findInt32("color-format", &colorFormat));

                        sp<MetaData> meta = new MetaData;
                        meta->setInt32(kKeyWidth, width);
                        meta->setInt32(kKeyHeight, height);
                        meta->setRect(kKeyCropRect, cropLeft, cropTop, cropRight, cropBottom);
                        meta->setInt32(kKeyColorFormat, colorFormat);

                        mRenderer->setSoftRenderer(
                                new SoftwareRenderer(mNativeWindow->getNativeWindow(), meta));
                    }
                }
            } else if (what == ACodec::kWhatShutdownCompleted) {
                ALOGV("%s shutdown completed", audio ? "audio" : "video");
@@ -703,8 +721,13 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
            } else if (what == ACodec::kWhatDrainThisBuffer) {
                renderBuffer(audio, codecRequest);
            } else if (what != ACodec::kWhatComponentAllocated
                    && what != ACodec::kWhatComponentConfigured
            } else if (what == ACodec::kWhatComponentAllocated) {
                if (!audio) {
                    AString name;
                    CHECK(codecRequest->findString("componentName", &name));
                    mNeedsSwRenderer = name.startsWith("OMX.google.");
                }
            } else if (what != ACodec::kWhatComponentConfigured
                    && what != ACodec::kWhatBuffersAllocated) {
                ALOGV("Unhandled codec notification %d '%c%c%c%c'.",
                      what,
+1 −0
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ private:
    sp<MediaPlayerBase::AudioSink> mAudioSink;
    sp<Decoder> mVideoDecoder;
    bool mVideoIsAVC;
    bool mNeedsSwRenderer;
    sp<Decoder> mAudioDecoder;
    sp<Renderer> mRenderer;

+12 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@

#include "NuPlayerRenderer.h"

#include "SoftwareRenderer.h"

#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -34,6 +36,7 @@ NuPlayer::Renderer::Renderer(
        const sp<AMessage> &notify,
        uint32_t flags)
    : mAudioSink(sink),
      mSoftRenderer(NULL),
      mNotify(notify),
      mFlags(flags),
      mNumFramesWritten(0),
@@ -57,6 +60,12 @@ NuPlayer::Renderer::Renderer(
}

NuPlayer::Renderer::~Renderer() {
    delete mSoftRenderer;
}

void NuPlayer::Renderer::setSoftRenderer(SoftwareRenderer *softRenderer) {
    delete mSoftRenderer;
    mSoftRenderer = softRenderer;
}

void NuPlayer::Renderer::queueBuffer(
@@ -414,6 +423,9 @@ void NuPlayer::Renderer::onDrainVideoQueue() {
             mVideoLateByUs, mVideoLateByUs / 1E6);
    } else {
        ALOGV("rendering video at media time %.2f secs", mediaTimeUs / 1E6);
        if (mSoftRenderer != NULL) {
            mSoftRenderer->render(entry->mBuffer->data(), entry->mBuffer->size(), NULL);
        }
    }

    entry->mNotifyConsumed->setInt32("render", !tooLate);
+4 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
namespace android {

struct ABuffer;
class SoftwareRenderer;

struct NuPlayer::Renderer : public AHandler {
    enum Flags {
@@ -56,6 +57,8 @@ struct NuPlayer::Renderer : public AHandler {
        kWhatMediaRenderingStart = 'mdrd',
    };

    void setSoftRenderer(SoftwareRenderer *softRenderer);

protected:
    virtual ~Renderer();

@@ -83,6 +86,7 @@ private:
    static const int64_t kMinPositionUpdateDelayUs;

    sp<MediaPlayerBase::AudioSink> mAudioSink;
    SoftwareRenderer *mSoftRenderer;
    sp<AMessage> mNotify;
    uint32_t mFlags;
    List<QueueEntry> mAudioQueue;