Home | History | Annotate | Download | only in libmedia
      1 /*
      2  **
      3  ** Copyright 2008, The Android Open Source Project
      4  **
      5  ** Licensed under the Apache License, Version 2.0 (the "License");
      6  ** you may not use this file except in compliance with the License.
      7  ** You may obtain a copy of the License at
      8  **
      9  **     http://www.apache.org/licenses/LICENSE-2.0
     10  **
     11  ** Unless required by applicable law or agreed to in writing, software
     12  ** distributed under the License is distributed on an "AS IS" BASIS,
     13  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  ** See the License for the specific language governing permissions and
     15  ** limitations under the License.
     16  */
     17 
     18 //#define LOG_NDEBUG 0
     19 #define LOG_TAG "IMediaRecorder"
     20 #include <utils/Log.h>
     21 #include <binder/Parcel.h>
     22 #include <surfaceflinger/ISurface.h>
     23 #include <camera/ICamera.h>
     24 #include <media/IMediaRecorderClient.h>
     25 #include <media/IMediaRecorder.h>
     26 #include <unistd.h>
     27 
     28 namespace android {
     29 
     30 enum {
     31     RELEASE = IBinder::FIRST_CALL_TRANSACTION,
     32     INIT,
     33     CLOSE,
     34     RESET,
     35     STOP,
     36     START,
     37     PREPARE,
     38     GET_MAX_AMPLITUDE,
     39     SET_VIDEO_SOURCE,
     40     SET_AUDIO_SOURCE,
     41     SET_OUTPUT_FORMAT,
     42     SET_VIDEO_ENCODER,
     43     SET_AUDIO_ENCODER,
     44     SET_OUTPUT_FILE_PATH,
     45     SET_OUTPUT_FILE_FD,
     46     SET_VIDEO_SIZE,
     47     SET_VIDEO_FRAMERATE,
     48     SET_PARAMETERS,
     49     SET_PREVIEW_SURFACE,
     50     SET_CAMERA,
     51     SET_LISTENER
     52 };
     53 
     54 class BpMediaRecorder: public BpInterface<IMediaRecorder>
     55 {
     56 public:
     57     BpMediaRecorder(const sp<IBinder>& impl)
     58     : BpInterface<IMediaRecorder>(impl)
     59     {
     60     }
     61 
     62     status_t setCamera(const sp<ICamera>& camera)
     63     {
     64         LOGV("setCamera(%p)", camera.get());
     65         Parcel data, reply;
     66         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
     67         data.writeStrongBinder(camera->asBinder());
     68         remote()->transact(SET_CAMERA, data, &reply);
     69         return reply.readInt32();
     70     }
     71 
     72     status_t setPreviewSurface(const sp<ISurface>& surface)
     73     {
     74         LOGV("setPreviewSurface(%p)", surface.get());
     75         Parcel data, reply;
     76         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
     77         data.writeStrongBinder(surface->asBinder());
     78         remote()->transact(SET_PREVIEW_SURFACE, data, &reply);
     79         return reply.readInt32();
     80     }
     81 
     82     status_t init()
     83     {
     84         LOGV("init");
     85         Parcel data, reply;
     86         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
     87         remote()->transact(INIT, data, &reply);
     88         return reply.readInt32();
     89     }
     90 
     91     status_t setVideoSource(int vs)
     92     {
     93         LOGV("setVideoSource(%d)", vs);
     94         Parcel data, reply;
     95         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
     96         data.writeInt32(vs);
     97         remote()->transact(SET_VIDEO_SOURCE, data, &reply);
     98         return reply.readInt32();
     99     }
    100 
    101     status_t setAudioSource(int as)
    102     {
    103         LOGV("setAudioSource(%d)", as);
    104         Parcel data, reply;
    105         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    106         data.writeInt32(as);
    107         remote()->transact(SET_AUDIO_SOURCE, data, &reply);
    108         return reply.readInt32();
    109     }
    110 
    111     status_t setOutputFormat(int of)
    112     {
    113         LOGV("setOutputFormat(%d)", of);
    114         Parcel data, reply;
    115         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    116         data.writeInt32(of);
    117         remote()->transact(SET_OUTPUT_FORMAT, data, &reply);
    118         return reply.readInt32();
    119     }
    120 
    121     status_t setVideoEncoder(int ve)
    122     {
    123         LOGV("setVideoEncoder(%d)", ve);
    124         Parcel data, reply;
    125         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    126         data.writeInt32(ve);
    127         remote()->transact(SET_VIDEO_ENCODER, data, &reply);
    128         return reply.readInt32();
    129     }
    130 
    131     status_t setAudioEncoder(int ae)
    132     {
    133         LOGV("setAudioEncoder(%d)", ae);
    134         Parcel data, reply;
    135         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    136         data.writeInt32(ae);
    137         remote()->transact(SET_AUDIO_ENCODER, data, &reply);
    138         return reply.readInt32();
    139     }
    140 
    141     status_t setOutputFile(const char* path)
    142     {
    143         LOGV("setOutputFile(%s)", path);
    144         Parcel data, reply;
    145         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    146         data.writeCString(path);
    147         remote()->transact(SET_OUTPUT_FILE_PATH, data, &reply);
    148         return reply.readInt32();
    149     }
    150 
    151     status_t setOutputFile(int fd, int64_t offset, int64_t length) {
    152         LOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
    153         Parcel data, reply;
    154         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    155         data.writeFileDescriptor(fd);
    156         data.writeInt64(offset);
    157         data.writeInt64(length);
    158         remote()->transact(SET_OUTPUT_FILE_FD, data, &reply);
    159         return reply.readInt32();
    160     }
    161 
    162     status_t setVideoSize(int width, int height)
    163     {
    164         LOGV("setVideoSize(%dx%d)", width, height);
    165         Parcel data, reply;
    166         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    167         data.writeInt32(width);
    168         data.writeInt32(height);
    169         remote()->transact(SET_VIDEO_SIZE, data, &reply);
    170         return reply.readInt32();
    171     }
    172 
    173     status_t setVideoFrameRate(int frames_per_second)
    174     {
    175         LOGV("setVideoFrameRate(%d)", frames_per_second);
    176         Parcel data, reply;
    177         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    178         data.writeInt32(frames_per_second);
    179         remote()->transact(SET_VIDEO_FRAMERATE, data, &reply);
    180         return reply.readInt32();
    181     }
    182 
    183     status_t setParameters(const String8& params)
    184     {
    185         LOGV("setParameter(%s)", params.string());
    186         Parcel data, reply;
    187         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    188         data.writeString8(params);
    189         remote()->transact(SET_PARAMETERS, data, &reply);
    190         return reply.readInt32();
    191     }
    192 
    193     status_t setListener(const sp<IMediaRecorderClient>& listener)
    194     {
    195         LOGV("setListener(%p)", listener.get());
    196         Parcel data, reply;
    197         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    198         data.writeStrongBinder(listener->asBinder());
    199         remote()->transact(SET_LISTENER, data, &reply);
    200         return reply.readInt32();
    201     }
    202 
    203     status_t prepare()
    204     {
    205         LOGV("prepare");
    206         Parcel data, reply;
    207         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    208         remote()->transact(PREPARE, data, &reply);
    209         return reply.readInt32();
    210     }
    211 
    212     status_t getMaxAmplitude(int* max)
    213     {
    214         LOGV("getMaxAmplitude");
    215         Parcel data, reply;
    216         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    217         remote()->transact(GET_MAX_AMPLITUDE, data, &reply);
    218         *max = reply.readInt32();
    219         return reply.readInt32();
    220     }
    221 
    222     status_t start()
    223     {
    224         LOGV("start");
    225         Parcel data, reply;
    226         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    227         remote()->transact(START, data, &reply);
    228         return reply.readInt32();
    229     }
    230 
    231     status_t stop()
    232     {
    233         LOGV("stop");
    234         Parcel data, reply;
    235         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    236         remote()->transact(STOP, data, &reply);
    237         return reply.readInt32();
    238     }
    239 
    240     status_t reset()
    241     {
    242         LOGV("reset");
    243         Parcel data, reply;
    244         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    245         remote()->transact(RESET, data, &reply);
    246         return reply.readInt32();
    247     }
    248 
    249     status_t close()
    250     {
    251         LOGV("close");
    252         Parcel data, reply;
    253         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    254         remote()->transact(CLOSE, data, &reply);
    255         return reply.readInt32();
    256     }
    257 
    258     status_t release()
    259     {
    260         LOGV("release");
    261         Parcel data, reply;
    262         data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
    263         remote()->transact(RELEASE, data, &reply);
    264         return reply.readInt32();
    265     }
    266 };
    267 
    268 IMPLEMENT_META_INTERFACE(MediaRecorder, "android.media.IMediaRecorder");
    269 
    270 // ----------------------------------------------------------------------
    271 
    272 status_t BnMediaRecorder::onTransact(
    273                                      uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    274 {
    275     switch(code) {
    276         case RELEASE: {
    277             LOGV("RELEASE");
    278             CHECK_INTERFACE(IMediaRecorder, data, reply);
    279             reply->writeInt32(release());
    280             return NO_ERROR;
    281         } break;
    282         case INIT: {
    283             LOGV("INIT");
    284             CHECK_INTERFACE(IMediaRecorder, data, reply);
    285             reply->writeInt32(init());
    286             return NO_ERROR;
    287         } break;
    288         case CLOSE: {
    289             LOGV("CLOSE");
    290             CHECK_INTERFACE(IMediaRecorder, data, reply);
    291             reply->writeInt32(close());
    292             return NO_ERROR;
    293         } break;
    294         case RESET: {
    295             LOGV("RESET");
    296             CHECK_INTERFACE(IMediaRecorder, data, reply);
    297             reply->writeInt32(reset());
    298             return NO_ERROR;
    299         } break;
    300         case STOP: {
    301             LOGV("STOP");
    302             CHECK_INTERFACE(IMediaRecorder, data, reply);
    303             reply->writeInt32(stop());
    304             return NO_ERROR;
    305         } break;
    306         case START: {
    307             LOGV("START");
    308             CHECK_INTERFACE(IMediaRecorder, data, reply);
    309             reply->writeInt32(start());
    310             return NO_ERROR;
    311         } break;
    312         case PREPARE: {
    313             LOGV("PREPARE");
    314             CHECK_INTERFACE(IMediaRecorder, data, reply);
    315             reply->writeInt32(prepare());
    316             return NO_ERROR;
    317         } break;
    318         case GET_MAX_AMPLITUDE: {
    319             LOGV("GET_MAX_AMPLITUDE");
    320             CHECK_INTERFACE(IMediaRecorder, data, reply);
    321             int max = 0;
    322             status_t ret = getMaxAmplitude(&max);
    323             reply->writeInt32(max);
    324             reply->writeInt32(ret);
    325             return NO_ERROR;
    326         } break;
    327         case SET_VIDEO_SOURCE: {
    328             LOGV("SET_VIDEO_SOURCE");
    329             CHECK_INTERFACE(IMediaRecorder, data, reply);
    330             int vs = data.readInt32();
    331             reply->writeInt32(setVideoSource(vs));
    332             return NO_ERROR;
    333         } break;
    334         case SET_AUDIO_SOURCE: {
    335             LOGV("SET_AUDIO_SOURCE");
    336             CHECK_INTERFACE(IMediaRecorder, data, reply);
    337             int as = data.readInt32();
    338             reply->writeInt32(setAudioSource(as));
    339             return NO_ERROR;
    340         } break;
    341         case SET_OUTPUT_FORMAT: {
    342             LOGV("SET_OUTPUT_FORMAT");
    343             CHECK_INTERFACE(IMediaRecorder, data, reply);
    344             int of = data.readInt32();
    345             reply->writeInt32(setOutputFormat(of));
    346             return NO_ERROR;
    347         } break;
    348         case SET_VIDEO_ENCODER: {
    349             LOGV("SET_VIDEO_ENCODER");
    350             CHECK_INTERFACE(IMediaRecorder, data, reply);
    351             int ve = data.readInt32();
    352             reply->writeInt32(setVideoEncoder(ve));
    353             return NO_ERROR;
    354         } break;
    355         case SET_AUDIO_ENCODER: {
    356             LOGV("SET_AUDIO_ENCODER");
    357             CHECK_INTERFACE(IMediaRecorder, data, reply);
    358             int ae = data.readInt32();
    359             reply->writeInt32(setAudioEncoder(ae));
    360             return NO_ERROR;
    361 
    362         } break;
    363         case SET_OUTPUT_FILE_PATH: {
    364             LOGV("SET_OUTPUT_FILE_PATH");
    365             CHECK_INTERFACE(IMediaRecorder, data, reply);
    366             const char* path = data.readCString();
    367             reply->writeInt32(setOutputFile(path));
    368             return NO_ERROR;
    369         } break;
    370         case SET_OUTPUT_FILE_FD: {
    371             LOGV("SET_OUTPUT_FILE_FD");
    372             CHECK_INTERFACE(IMediaRecorder, data, reply);
    373             int fd = dup(data.readFileDescriptor());
    374             int64_t offset = data.readInt64();
    375             int64_t length = data.readInt64();
    376             reply->writeInt32(setOutputFile(fd, offset, length));
    377             ::close(fd);
    378             return NO_ERROR;
    379         } break;
    380         case SET_VIDEO_SIZE: {
    381             LOGV("SET_VIDEO_SIZE");
    382             CHECK_INTERFACE(IMediaRecorder, data, reply);
    383             int width = data.readInt32();
    384             int height = data.readInt32();
    385             reply->writeInt32(setVideoSize(width, height));
    386             return NO_ERROR;
    387         } break;
    388         case SET_VIDEO_FRAMERATE: {
    389             LOGV("SET_VIDEO_FRAMERATE");
    390             CHECK_INTERFACE(IMediaRecorder, data, reply);
    391             int frames_per_second = data.readInt32();
    392             reply->writeInt32(setVideoFrameRate(frames_per_second));
    393             return NO_ERROR;
    394         } break;
    395         case SET_PARAMETERS: {
    396             LOGV("SET_PARAMETER");
    397             CHECK_INTERFACE(IMediaRecorder, data, reply);
    398             reply->writeInt32(setParameters(data.readString8()));
    399             return NO_ERROR;
    400         } break;
    401         case SET_LISTENER: {
    402             LOGV("SET_LISTENER");
    403             CHECK_INTERFACE(IMediaRecorder, data, reply);
    404             sp<IMediaRecorderClient> listener =
    405                 interface_cast<IMediaRecorderClient>(data.readStrongBinder());
    406             reply->writeInt32(setListener(listener));
    407             return NO_ERROR;
    408         } break;
    409         case SET_PREVIEW_SURFACE: {
    410             LOGV("SET_PREVIEW_SURFACE");
    411             CHECK_INTERFACE(IMediaRecorder, data, reply);
    412             sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
    413             reply->writeInt32(setPreviewSurface(surface));
    414             return NO_ERROR;
    415         } break;
    416         case SET_CAMERA: {
    417             LOGV("SET_CAMERA");
    418             CHECK_INTERFACE(IMediaRecorder, data, reply);
    419             sp<ICamera> camera = interface_cast<ICamera>(data.readStrongBinder());
    420             reply->writeInt32(setCamera(camera));
    421             return NO_ERROR;
    422         } break;
    423         default:
    424             return BBinder::onTransact(code, data, reply, flags);
    425     }
    426 }
    427 
    428 // ----------------------------------------------------------------------------
    429 
    430 }; // namespace android
    431