blob: 4be9bf62cf2d026e4e3749b6c7b9ef2b9f141c3e [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef VIDEO_SOURCE_H_
#define VIDEO_SOURCE_H_
#include <media/MediaSource.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaData.h>
namespace android {
class VideoSource : public MediaSource {
static const int32_t kFramerate = 24; // fps
public:
VideoSource(int width, int height)
: mWidth(width),
mHeight(height),
mSize((width * height * 3) / 2) {
mGroup.add_buffer(new MediaBuffer(mSize));
}
virtual sp<MetaData> getFormat() {
sp<MetaData> meta = new MetaData;
meta->setInt32(kKeyWidth, mWidth);
meta->setInt32(kKeyHeight, mHeight);
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
return meta;
}
virtual status_t start(MetaData *params) {
mNumFramesOutput = 0;
return OK;
}
virtual status_t stop() {
return OK;
}
virtual status_t read(
MediaBuffer **buffer, const MediaSource::ReadOptions *options) {
if (mNumFramesOutput == kFramerate * 100) {
// Stop returning data after 10 secs.
return ERROR_END_OF_STREAM;
}
// printf("VideoSource::read\n");
status_t err = mGroup.acquire_buffer(buffer);
if (err != OK) {
return err;
}
char x = (char)((double)rand() / RAND_MAX * 255);
memset((*buffer)->data(), x, mSize);
(*buffer)->set_range(0, mSize);
(*buffer)->meta_data()->clear();
(*buffer)->meta_data()->setInt64(
kKeyTime, (mNumFramesOutput * 1000000) / kFramerate);
++mNumFramesOutput;
// printf("VideoSource::read - returning buffer\n");
// LOG(INFO)("VideoSource::read - returning buffer");
return OK;
}
protected:
virtual ~VideoSource() {}
private:
MediaBufferGroup mGroup;
int mWidth, mHeight;
size_t mSize;
int64_t mNumFramesOutput;;
VideoSource(const VideoSource &);
VideoSource &operator=(const VideoSource &);
};
} // namespace android
#endif // VIDEO_SOURCE_H_