summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/mediarecorder.h8
-rw-r--r--include/media/stagefright/AudioSource.h6
-rw-r--r--include/media/stagefright/CameraSource.h4
-rw-r--r--media/libavextensions/common/AVExtensionsCommon.h2
-rw-r--r--media/libavextensions/common/ExtensionsLoader.hpp2
-rw-r--r--media/libavextensions/media/AVMediaExtensions.h3
-rw-r--r--media/libavextensions/media/AVMediaUtils.cpp5
-rw-r--r--media/libavextensions/stagefright/AVExtensions.h25
-rw-r--r--media/libavextensions/stagefright/AVFactory.cpp28
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.cpp15
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.h6
-rw-r--r--media/libstagefright/MPEG4Writer.cpp6
-rw-r--r--media/libstagefright/MediaCodecSource.cpp5
13 files changed, 92 insertions, 23 deletions
diff --git a/include/media/mediarecorder.h b/include/media/mediarecorder.h
index b74f888..6ace36d 100644
--- a/include/media/mediarecorder.h
+++ b/include/media/mediarecorder.h
@@ -236,13 +236,13 @@ public:
status_t setOutputFile(int fd, int64_t offset, int64_t length);
status_t setVideoSize(int width, int height);
status_t setVideoFrameRate(int frames_per_second);
- status_t setParameters(const String8& params);
+ virtual status_t setParameters(const String8& params);
status_t setListener(const sp<MediaRecorderListener>& listener);
status_t setClientName(const String16& clientName);
status_t prepare();
status_t getMaxAmplitude(int* max);
- status_t start();
- status_t stop();
+ virtual status_t start();
+ virtual status_t stop();
status_t reset();
status_t init();
status_t close();
@@ -251,7 +251,7 @@ public:
status_t setInputSurface(const sp<PersistentSurface>& surface);
sp<IGraphicBufferProducer> querySurfaceMediaSourceFromMediaServer();
-private:
+protected:
void doCleanUp();
status_t doReset();
diff --git a/include/media/stagefright/AudioSource.h b/include/media/stagefright/AudioSource.h
index ed523d8..9750bcd 100644
--- a/include/media/stagefright/AudioSource.h
+++ b/include/media/stagefright/AudioSource.h
@@ -46,6 +46,8 @@ struct AudioSource : public MediaSource, public MediaBufferObserver {
virtual status_t stop() { return reset(); }
virtual sp<MetaData> getFormat();
+ virtual status_t pause() { return ERROR_UNSUPPORTED; }
+
// Returns the maximum amplitude since last call.
int16_t getMaxAmplitude();
@@ -58,7 +60,7 @@ struct AudioSource : public MediaSource, public MediaBufferObserver {
protected:
virtual ~AudioSource();
-private:
+protected:
enum {
//calculated for max duration 80 msec with 48K sampling rate.
kMaxBufferSize = 30720,
@@ -102,7 +104,7 @@ private:
int32_t startFrame, int32_t rampDurationFrames,
uint8_t *data, size_t bytes);
- void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs);
+ virtual void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs);
void releaseQueuedFrames_l();
void waitOutstandingEncodingFrames_l();
virtual status_t reset();
diff --git a/include/media/stagefright/CameraSource.h b/include/media/stagefright/CameraSource.h
index 069e897..527ee15 100644
--- a/include/media/stagefright/CameraSource.h
+++ b/include/media/stagefright/CameraSource.h
@@ -92,6 +92,8 @@ public:
virtual status_t read(
MediaBuffer **buffer, const ReadOptions *options = NULL);
+ virtual status_t pause() { return ERROR_UNSUPPORTED; }
+
/**
* Check whether a CameraSource object is properly initialized.
* Must call this method before stop().
@@ -189,7 +191,7 @@ protected:
void releaseCamera();
-private:
+protected:
friend struct CameraSourceListener;
Mutex mLock;
diff --git a/media/libavextensions/common/AVExtensionsCommon.h b/media/libavextensions/common/AVExtensionsCommon.h
index 52a247a..c39872e 100644
--- a/media/libavextensions/common/AVExtensionsCommon.h
+++ b/media/libavextensions/common/AVExtensionsCommon.h
@@ -31,8 +31,6 @@
namespace android {
-static const char * CUSTOMIZATION_LIB_NAME = "libavenhancements.so";
-
typedef void *(*createFunction_t)(void);
template <typename T>
diff --git a/media/libavextensions/common/ExtensionsLoader.hpp b/media/libavextensions/common/ExtensionsLoader.hpp
index b23b868..e03979c 100644
--- a/media/libavextensions/common/ExtensionsLoader.hpp
+++ b/media/libavextensions/common/ExtensionsLoader.hpp
@@ -31,6 +31,8 @@
namespace android {
+static const char * CUSTOMIZATION_LIB_NAME = "libavenhancements.so";
+
/*
* Create strongly-typed objects of type T
* If the customization library exists and does contain a "named" constructor,
diff --git a/media/libavextensions/media/AVMediaExtensions.h b/media/libavextensions/media/AVMediaExtensions.h
index 4dc3d95..ea5245c 100644
--- a/media/libavextensions/media/AVMediaExtensions.h
+++ b/media/libavextensions/media/AVMediaExtensions.h
@@ -36,6 +36,7 @@
namespace android {
+class MediaRecorder;
/*
* Common delegate to the classes in libstagefright
*/
@@ -57,6 +58,8 @@ struct AVMediaUtils {
virtual size_t AudioTrackGetOffloadFrameCount(size_t frameCount) {
return frameCount;
}
+
+ virtual sp<MediaRecorder> createMediaRecorder(const String16& opPackageName);
// ----- NO TRESSPASSING BEYOND THIS LINE ------
DECLARE_LOADABLE_SINGLETON(AVMediaUtils);
};
diff --git a/media/libavextensions/media/AVMediaUtils.cpp b/media/libavextensions/media/AVMediaUtils.cpp
index 7c21414..0f9e9eb 100644
--- a/media/libavextensions/media/AVMediaUtils.cpp
+++ b/media/libavextensions/media/AVMediaUtils.cpp
@@ -40,6 +40,7 @@
#include <media/stagefright/ACodec.h>
#include <media/AudioTrack.h>
+#include <media/mediarecorder.h>
#include "common/ExtensionsLoader.hpp"
#include "media/AVMediaExtensions.h"
@@ -53,6 +54,10 @@ AVMediaUtils::AVMediaUtils() {
AVMediaUtils::~AVMediaUtils() {
}
+sp<MediaRecorder> AVMediaUtils::createMediaRecorder(const String16& opPackageName) {
+ return new MediaRecorder(opPackageName);
+}
+
//static
AVMediaUtils *AVMediaUtils::sInst =
ExtensionsLoader<AVMediaUtils>::createInstance("createExtendedMediaUtils");
diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h
index 4d73f59..e75499f 100644
--- a/media/libavextensions/stagefright/AVExtensions.h
+++ b/media/libavextensions/stagefright/AVExtensions.h
@@ -46,10 +46,18 @@ struct ACodec;
struct ALooper;
struct IMediaHTTPConnection;
struct MediaCodec;
+struct MediaSource;
struct MediaHTTP;
struct NuCachedSource2;
class CameraParameters;
class MediaBuffer;
+struct AudioSource;
+class CameraSource;
+class ICamera;
+class ICameraRecordingProxy;
+class String16;
+class IGraphicBufferProducer;
+struct Size;
/*
* Factory to create objects of base-classes in libstagefright
@@ -69,6 +77,23 @@ struct AVFactory {
virtual MediaHTTP* createMediaHTTP(
const sp<IMediaHTTPConnection> &conn);
+ virtual AudioSource* createAudioSource(
+ audio_source_t inputSource,
+ const String16 &opPackageName,
+ uint32_t sampleRate,
+ uint32_t channels,
+ uint32_t outSampleRate = 0);
+
+ virtual CameraSource *CreateFromCamera(
+ const sp<ICamera> &camera,
+ const sp<ICameraRecordingProxy> &proxy,
+ int32_t cameraId,
+ const String16& clientName,
+ uid_t clientUid,
+ Size videoSize,
+ int32_t frameRate,
+ const sp<IGraphicBufferProducer>& surface,
+ bool storeMetaDataInVideoBuffers = true);
// ----- NO TRESSPASSING BEYOND THIS LINE ------
DECLARE_LOADABLE_SINGLETON(AVFactory);
};
diff --git a/media/libavextensions/stagefright/AVFactory.cpp b/media/libavextensions/stagefright/AVFactory.cpp
index fe00f45..19977e9 100644
--- a/media/libavextensions/stagefright/AVFactory.cpp
+++ b/media/libavextensions/stagefright/AVFactory.cpp
@@ -41,6 +41,9 @@
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaExtractor.h>
#include <media/stagefright/MediaHTTP.h>
+#include <media/stagefright/AudioSource.h>
+#include <media/stagefright/CameraSource.h>
+#include <camera/CameraParameters.h>
#include "common/ExtensionsLoader.hpp"
#include "stagefright/AVExtensions.h"
@@ -75,6 +78,31 @@ MediaHTTP* AVFactory::createMediaHTTP(
return new MediaHTTP(conn);
}
+AudioSource* AVFactory::createAudioSource(
+ audio_source_t inputSource,
+ const String16 &opPackageName,
+ uint32_t sampleRate,
+ uint32_t channels,
+ uint32_t outSampleRate) {
+ return new AudioSource(inputSource, opPackageName, sampleRate,
+ channels, outSampleRate);
+}
+
+CameraSource* AVFactory::CreateFromCamera(
+ const sp<ICamera> &camera,
+ const sp<ICameraRecordingProxy> &proxy,
+ int32_t cameraId,
+ const String16& clientName,
+ uid_t clientUid,
+ Size videoSize,
+ int32_t frameRate,
+ const sp<IGraphicBufferProducer>& surface,
+ bool storeMetaDataInVideoBuffers) {
+ return CameraSource::CreateFromCamera(camera, proxy, cameraId,
+ clientName, clientUid, videoSize, frameRate, surface,
+ storeMetaDataInVideoBuffers);
+}
+
// ----- NO TRESSPASSING BEYOND THIS LINE ------
AVFactory::AVFactory() {
}
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 4f3e2ea..136e6cf 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -939,13 +939,12 @@ sp<MediaSource> StagefrightRecorder::createAudioSource() {
}
}
- sp<AudioSource> audioSource =
- new AudioSource(
- mAudioSource,
- mOpPackageName,
- sourceSampleRate,
- mAudioChannels,
- mSampleRate);
+ sp<AudioSource> audioSource = AVFactory::get()->createAudioSource(
+ mAudioSource,
+ mOpPackageName,
+ sourceSampleRate,
+ mAudioChannels,
+ mSampleRate);
status_t err = audioSource->initCheck();
@@ -1472,7 +1471,7 @@ status_t StagefrightRecorder::setupCameraSource(
mTimeBetweenCaptureUs);
*cameraSource = mCameraSourceTimeLapse;
} else {
- *cameraSource = CameraSource::CreateFromCamera(
+ *cameraSource = AVFactory::get()->CreateFromCamera(
mCamera, mCameraProxy, mCameraId, mClientName, mClientUid,
videoSize, mFrameRate,
mPreviewSurface);
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 6b9bc92..d2ff62d 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -140,7 +140,7 @@ protected:
status_t setupRawAudioRecording();
status_t setupRTPRecording();
status_t setupMPEG2TSRecording();
- sp<MediaSource> createAudioSource();
+ virtual sp<MediaSource> createAudioSource();
virtual status_t checkVideoEncoderCapabilities();
status_t checkAudioEncoderCapabilities();
// Generic MediaSource set-up. Returns the appropriate
@@ -149,13 +149,13 @@ protected:
status_t setupMediaSource(sp<MediaSource> *mediaSource);
status_t setupCameraSource(sp<CameraSource> *cameraSource);
status_t setupAudioEncoder(const sp<MediaWriter>& writer);
- status_t setupVideoEncoder(sp<MediaSource> cameraSource, sp<MediaSource> *source);
+ virtual status_t setupVideoEncoder(sp<MediaSource> cameraSource, sp<MediaSource> *source);
virtual void setupCustomVideoEncoderParams(sp<MediaSource> /*cameraSource*/,
sp<AMessage> &/*format*/) {}
virtual bool setCustomVideoEncoderMime(const video_encoder videoEncoder, sp<AMessage> format);
// Encoding parameter handling utilities
- status_t setParameter(const String8 &key, const String8 &value);
+ virtual status_t setParameter(const String8 &key, const String8 &value);
status_t setParamAudioEncodingBitRate(int32_t bitRate);
status_t setParamAudioNumberOfChannels(int32_t channles);
status_t setParamAudioSamplingRate(int32_t sampleRate);
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index dd80b42..94f40b4 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -697,8 +697,6 @@ status_t MPEG4Writer::start(MetaData *param) {
mIsRealTimeRecording = isRealTimeRecording;
}
- mStartTimestampUs = -1;
-
if (mStarted) {
if (mPaused) {
mPaused = false;
@@ -707,6 +705,8 @@ status_t MPEG4Writer::start(MetaData *param) {
return OK;
}
+ mStartTimestampUs = -1;
+
if (!param ||
!param->findInt32(kKeyTimeScale, &mTimeScale)) {
mTimeScale = 1000;
@@ -2331,6 +2331,7 @@ status_t MPEG4Writer::Track::threadEntry() {
previousPausedDurationUs = mStartTimestampUs;
}
+#if 0
if (mResumed) {
int64_t durExcludingEarlierPausesUs = timestampUs - previousPausedDurationUs;
if (WARN_UNLESS(durExcludingEarlierPausesUs >= 0ll, "for %s track", trackName)) {
@@ -2347,6 +2348,7 @@ status_t MPEG4Writer::Track::threadEntry() {
previousPausedDurationUs += pausedDurationUs - lastDurationUs;
mResumed = false;
}
+#endif
timestampUs -= previousPausedDurationUs;
if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) {
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index ac25683..dbd9cb0 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -645,6 +645,9 @@ status_t MediaCodecSource::onStart(MetaData *params) {
resume();
} else {
CHECK(mPuller != NULL);
+ if (mIsVideo) {
+ mEncoder->requestIDRFrame();
+ }
mPuller->resume();
}
return OK;
@@ -864,7 +867,7 @@ void MediaCodecSource::onMessageReceived(const sp<AMessage> &msg) {
}
case kWhatPause:
{
- if (mFlags && FLAG_USE_SURFACE_INPUT) {
+ if (mFlags & FLAG_USE_SURFACE_INPUT) {
suspend();
} else {
CHECK(mPuller != NULL);