1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef STAGEFRIGHT_DATACONVERTER_H_ 18#define STAGEFRIGHT_DATACONVERTER_H_ 19 20#include <utils/Errors.h> 21#include <utils/RefBase.h> 22 23#include <media/stagefright/MediaDefs.h> 24 25namespace android { 26 27struct ABuffer; 28 29// DataConverter base class, defaults to memcpy 30struct DataConverter : public RefBase { 31 virtual size_t sourceSize(size_t targetSize); // will clamp to SIZE_MAX 32 virtual size_t targetSize(size_t sourceSize); // will clamp to SIZE_MAX 33 34 status_t convert(const sp<ABuffer> &source, sp<ABuffer> &target); 35 virtual ~DataConverter(); 36 37protected: 38 virtual status_t safeConvert(const sp<ABuffer> &source, sp<ABuffer> &target); 39}; 40 41// SampleConverterBase uses a ratio to calculate the source and target sizes 42// based on source and target sample sizes. 43struct SampleConverterBase : public DataConverter { 44 virtual size_t sourceSize(size_t targetSize); 45 virtual size_t targetSize(size_t sourceSize); 46 47protected: 48 virtual status_t safeConvert(const sp<ABuffer> &source, sp<ABuffer> &target) = 0; 49 50 // sourceSize = sourceSampleSize / targetSampleSize * targetSize 51 SampleConverterBase(uint32_t sourceSampleSize, uint32_t targetSampleSize) 52 : mSourceSampleSize(sourceSampleSize), 53 mTargetSampleSize(targetSampleSize) { } 54 size_t mSourceSampleSize; 55 size_t mTargetSampleSize; 56}; 57 58// AudioConverter converts between audio PCM formats 59struct AudioConverter : public SampleConverterBase { 60 // return nullptr if conversion is not needed or not supported 61 static AudioConverter *Create(AudioEncoding source, AudioEncoding target); 62 63protected: 64 virtual status_t safeConvert(const sp<ABuffer> &src, sp<ABuffer> &tgt); 65 66private: 67 AudioConverter( 68 AudioEncoding source, size_t sourceSample, 69 AudioEncoding target, size_t targetSample) 70 : SampleConverterBase(sourceSample, targetSample), 71 mFrom(source), 72 mTo(target) { } 73 AudioEncoding mFrom; 74 AudioEncoding mTo; 75}; 76 77} // namespace android 78 79#endif 80