blob: c2f6f1045ba1d16cbdc3220b9c4f38d8910aadc3 [file] [log] [blame]
/*
* Copyright (C) 2021 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 ANDROID_MEDIA_APPENDER_H
#define ANDROID_MEDIA_APPENDER_H
#include <media/stagefright/MediaMuxer.h>
#include <media/stagefright/NuMediaExtractor.h>
#include <stack>
namespace android {
struct MediaAppender : public MediaMuxerBase {
public:
enum AppendMode {
APPEND_MODE_FIRST = 0,
APPEND_MODE_IGNORE_LAST_VIDEO_GOP = APPEND_MODE_FIRST,
APPEND_MODE_ADD_TO_EXISTING_DATA = 1,
APPEND_MODE_LAST = APPEND_MODE_ADD_TO_EXISTING_DATA,
};
static sp<MediaAppender> create(int fd, AppendMode mode);
virtual ~MediaAppender();
status_t init();
status_t start();
status_t stop();
status_t writeSampleData(const sp<ABuffer>& buffer, size_t trackIndex, int64_t timeUs,
uint32_t flags);
status_t setOrientationHint(int degrees);
status_t setLocation(int latitude, int longitude);
ssize_t addTrack(const sp<AMessage> &format);
ssize_t getTrackCount();
sp<AMessage> getTrackFormat(size_t idx);
private:
MediaAppender(int fd, AppendMode mode);
int mFd;
MediaMuxer::OutputFormat mFormat;
AppendMode mMode;
sp<NuMediaExtractor> mExtractor;
sp<MediaMuxer> mMuxer;
size_t mTrackCount;
// Map track index given by extractor to the ones received from muxer.
std::map<size_t, ssize_t> mTrackIndexMap;
// Count of the samples in each track, indexed by extractor track ids.
std::vector<size_t> mSampleCountVect;
// Extractor track index of samples.
std::vector<size_t> mSampleIndexVect;
// Track format indexed by extractor track ids.
std::map<size_t, sp<AMessage>> mFmtIndexMap;
// Size of samples.
std::vector<size_t> mSampleSizeVect;
// Presentation time stamp of samples.
std::vector<int64_t> mSampleTimeVect;
// Timestamp of last sample of tracks.
std::vector<int64_t> mMaxTimestampVect;
// Metadata of samples.
std::vector<sp<MetaData>> mSampleMetaVect;
std::mutex mMutex;
// Timestamp of the last sync sample of tracks.
std::vector<int64_t> mLastSyncSampleTimeVect;
struct sampleDataInfo;
std::vector<sampleDataInfo> mSDI;
enum : int {
UNINITIALIZED,
INITIALIZED,
STARTED,
STOPPED,
ERROR,
} mState GUARDED_BY(mMutex);
};
} // namespace android
#endif // ANDROID_MEDIA_APPENDER_H