當前位置:編程學習大全網 - 源碼下載 - 如何閱讀android framework源碼

如何閱讀android framework源碼

首先看MediaRecorder.java內的setVideoEncoder方法:

/**

* Sets the video encoder to be used for recording. If this method is not

* called, the output file will not contain an video track. Call this after

* setOutputFormat() and before prepare().

*

* @param video_encoder the video encoder to use.

* @throws IllegalStateException if it is called before

* setOutputFormat() or after prepare()

* @see android.media.MediaRecorder.VideoEncoder

*/

public native void setVideoEncoder(int video_encoder)

throws IllegalStateException;123456789101112

這是壹個native方法,根據JNI的規則,我們應該去android_media_MediaRecorder.cpp裏看這個方法的實現:

static void

android_media_MediaRecorder_setVideoEncoder(JNIEnv *env, jobject thiz, jint ve)

{

ALOGV("setVideoEncoder(%d)", ve);

if (ve < VIDEO_ENCODER_DEFAULT || ve >= VIDEO_ENCODER_LIST_END) {

jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid video encoder");

return;

}

sp<MediaRecorder> mr = getMediaRecorder(env, thiz);

process_media_recorder_call(env, mr->setVideoEncoder(ve), "java/lang/RuntimeException", "setVideoEncoder failed.");

}1234567891011

關鍵是最後的兩句,sp是Android 裏的壹個指針,就當沒看見~ 所以最後兩句的意思是調用Native層的MediaRecorder的setVideoEncoder方法。

繼續去MediaRecorder.cpp裏看setVideoEncoder方法:

status_t MediaRecorder::setVideoEncoder(int ve)

{

ALOGV("setVideoEncoder(%d)", ve);

if (mMediaRecorder == NULL) {

ALOGE("media recorder is not initialized yet");

return INVALID_OPERATION;

}

if (!mIsVideoSourceSet) {

ALOGE("try to set the video encoder without setting the video source first");

return INVALID_OPERATION;

}

if (mIsVideoEncoderSet) {

ALOGE("video encoder has already been set");

return INVALID_OPERATION;

}

if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {

ALOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);

return INVALID_OPERATION;

}

status_t ret = mMediaRecorder->setVideoEncoder(ve);

if (OK != ret) {

ALOGV("setVideoEncoder failed: %d", ret);

mCurrentState = MEDIA_RECORDER_ERROR;

return ret;

}

mIsVideoEncoderSet = true;

return ret;

}1234567891011121314151617181920212223242526272829

這裏的mMediaReocorder定義在MediaRecorder.h裏:

sp<IMediaRecorder> mMediaRecorder;1

可見其是壹個IMediaRecorder類型的變量,這是壹個接口類型,看壹下其接口定義,在IMediaRecorder.h中:

class IMediaRecorder: public IInterface

{

public:

DECLARE_META_INTERFACE(MediaRecorder);

virtual status_t setCamera(const sp<hardware::ICamera>& camera,

const sp<ICameraRecordingProxy>& proxy) = 0;

virtual status_t setPreviewSurface(const sp<IGraphicBufferProducer>& surface) = 0;

virtual status_t setVideoSource(int vs) = 0;

virtual status_t setAudioSource(int as) = 0;

virtual status_t setOutputFormat(int of) = 0;

virtual status_t setVideoEncoder(int ve) = 0;

virtual status_t setAudioEncoder(int ae) = 0;

virtual status_t setOutputFile(int fd, int64_t offset, int64_t length) = 0;

virtual status_t setVideoSize(int width, int height) = 0;

virtual status_t setVideoFrameRate(int frames_per_second) = 0;

virtual status_t setParameters(const String8& params) = 0;

virtual status_t setListener(const sp<IMediaRecorderClient>& listener) = 0;

virtual status_t setClientName(const String16& clientName) = 0;

virtual status_t prepare() = 0;

virtual status_t getMaxAmplitude(int* max) = 0;

virtual status_t start() = 0;

virtual status_t stop() = 0;

virtual status_t reset() = 0;

virtual status_t pause() = 0;

virtual status_t resume() = 0;

virtual status_t init() = 0;

virtual status_t close() = 0;

virtual status_t release() = 0;

virtual status_t setInputSurface(const sp<IGraphicBufferConsumer>& surface) = 0;

virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() = 0;

};

// ----------------------------------------------------------------------------

class BnMediaRecorder: public BnInterface<IMediaRecorder>

{

public:

virtual status_t onTransact( uint32_t code,

const Parcel& data,

Parcel* reply,

uint32_t flags = 0);

};12345678910111213141516171819202122232425262728293031323334353637383940414243

吶~關鍵的步驟來了,在以前我基本就追到這,就算完蛋了,不知道怎麽繼續往下追了,後來看Binder相關的內容,知道了BnInterface的作用,這是Binder中關鍵的壹環,我們這就不展開講了,只要記得,接下來我們要追的是BnMediaRecorder這個類。

全局搜索壹下“: public BnMediaRecorder”,也就是去找它的實現類,發現在MediaRecorderClient.h當中有如下的定義:

class MediaRecorderClient : public BnMediaRecorder

{

class ServiceDeathNotifier: public IBinder::DeathRecipient

{

public:

ServiceDeathNotifier(

const sp<IBinder>& service,

const sp<IMediaRecorderClient>& listener,

int which);

virtual ~ServiceDeathNotifier();

virtual void binderDied(const wp<IBinder>& who);

private:

int mWhich;

sp<IBinder> mService;

wp<IMediaRecorderClient> mListener;

};

public:

virtual status_t setCamera(const sp<hardware::ICamera>& camera,

const sp<ICameraRecordingProxy>& proxy);

virtual status_t setPreviewSurface(const sp<IGraphicBufferProducer>& surface);

virtual status_t setVideoSource(int vs);

virtual status_t setAudioSource(int as);

virtual status_t setOutputFormat(int of);

virtual status_t setVideoEncoder(int ve);

virtual status_t setAudioEncoder(int ae);

virtual status_t setOutputFile(int fd, int64_t offset,

int64_t length);

virtual status_t setVideoSize(int width, int height);

virtual status_t setVideoFrameRate(int frames_per_second);

virtual status_t setParameters(const String8& params);

virtual status_t setListener(

const sp<IMediaRecorderClient>& listener);

virtual status_t setClientName(const String16& clientName);

virtual status_t prepare();

virtual status_t getMaxAmplitude(int* max);

virtual status_t start();

virtual status_t stop();

virtual status_t reset();

virtual status_t pause();

virtual status_t resume();

virtual status_t init();

virtual status_t close();

virtual status_t release();

virtual status_t dump(int fd, const Vector<String16>& args);

virtual status_t setInputSurface(const sp<IGraphicBufferConsumer>& surface);

virtual sp<IGraphicBufferProducer> querySurfaceMediaSource();

private:

friend class MediaPlayerService; // for accessing private constructor

MediaRecorderClient(

const sp<MediaPlayerService>& service,

pid_t pid,

const String16& opPackageName);

virtual ~MediaRecorderClient();

sp<IBinder::DeathRecipient> mCameraDeathListener;

sp<IBinder::DeathRecipient> mCodecDeathListener;

pid_t mPid;

Mutex mLock;

MediaRecorderBase *mRecorder;

sp<MediaPlayerService> mMediaPlayerService;

};123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

那麽我們去MediaRecorderClient.cpp裏看看:

status_t MediaRecorderClient::setVideoEncoder(int ve)

{

ALOGV("setVideoEncoder(%d)", ve);

Mutex::Autolock lock(mLock);

if (mRecorder == NULL) {

ALOGE("recorder is not initialized");

return NO_INIT;

}

return mRecorder->setVideoEncoder((video_encoder)ve);

}12345678910

這裏的mRecorder 定義在MediaRecorderClient.h當中:

MediaRecorderBase *mRecorder;1

來,我們繼續搜索“: public MediaRecorderBase”,在StagefrightRecorder.h中找到了,那麽我們去StagefrightRecorder.cpp當中看看~

status_t StagefrightRecorder::setVideoEncoder(video_encoder ve) {

ALOGV("setVideoEncoder: %d", ve);

if (ve < VIDEO_ENCODER_DEFAULT ||

ve >= VIDEO_ENCODER_LIST_END) {

ALOGE("Invalid video encoder: %d", ve);

return BAD_VALUE;

}

mVideoEncoder = ve;

return OK;

}123456789101112

吶,這就算完了~最後我們會發現MediaRecorder中的接口實現基本到最後都會落在這個StagefrightRecorder.cpp當中。

  • 上一篇:女學生五壹來重慶超全的旅遊攻略
  • 下一篇:關於寫清明節的散文作品?
  • copyright 2024編程學習大全網