15b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar/* 25b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * Copyright (C) 2016 The Android Open Source Project 35b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * 45b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 55b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * you may not use this file except in compliance with the License. 65b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * You may obtain a copy of the License at 75b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * 85b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 95b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * 105b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * Unless required by applicable law or agreed to in writing, software 115b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 125b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * See the License for the specific language governing permissions and 145b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar * limitations under the License. 155b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar */ 165b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 175b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar#ifndef STAGEFRIGHT_DATACONVERTER_H_ 185b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar#define STAGEFRIGHT_DATACONVERTER_H_ 195b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 205b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar#include <utils/Errors.h> 215b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar#include <utils/RefBase.h> 225b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 235b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar#include <media/stagefright/MediaDefs.h> 245b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 255b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarnamespace android { 265b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 277e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer; 285b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 295b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar// DataConverter base class, defaults to memcpy 305b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarstruct DataConverter : public RefBase { 315b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar virtual size_t sourceSize(size_t targetSize); // will clamp to SIZE_MAX 325b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar virtual size_t targetSize(size_t sourceSize); // will clamp to SIZE_MAX 335b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 347e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim status_t convert(const sp<MediaCodecBuffer> &source, sp<MediaCodecBuffer> &target); 355b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar virtual ~DataConverter(); 365b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 375b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarprotected: 387e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim virtual status_t safeConvert(const sp<MediaCodecBuffer> &source, sp<MediaCodecBuffer> &target); 395b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar}; 405b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 415b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar// SampleConverterBase uses a ratio to calculate the source and target sizes 425b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar// based on source and target sample sizes. 435b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarstruct SampleConverterBase : public DataConverter { 445b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar virtual size_t sourceSize(size_t targetSize); 455b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar virtual size_t targetSize(size_t sourceSize); 465b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 475b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarprotected: 487e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim virtual status_t safeConvert(const sp<MediaCodecBuffer> &source, sp<MediaCodecBuffer> &target) = 0; 495b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 505b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar // sourceSize = sourceSampleSize / targetSampleSize * targetSize 515b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar SampleConverterBase(uint32_t sourceSampleSize, uint32_t targetSampleSize) 525b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar : mSourceSampleSize(sourceSampleSize), 535b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mTargetSampleSize(targetSampleSize) { } 545b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar size_t mSourceSampleSize; 555b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar size_t mTargetSampleSize; 565b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar}; 575b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 585b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar// AudioConverter converts between audio PCM formats 595b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarstruct AudioConverter : public SampleConverterBase { 605b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar // return nullptr if conversion is not needed or not supported 615b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar static AudioConverter *Create(AudioEncoding source, AudioEncoding target); 625b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 635b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarprotected: 647e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim virtual status_t safeConvert(const sp<MediaCodecBuffer> &source, sp<MediaCodecBuffer> &target); 655b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 665b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnarprivate: 675b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar AudioConverter( 685b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar AudioEncoding source, size_t sourceSample, 695b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar AudioEncoding target, size_t targetSample) 705b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar : SampleConverterBase(sourceSample, targetSample), 715b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mFrom(source), 725b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar mTo(target) { } 735b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar AudioEncoding mFrom; 745b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar AudioEncoding mTo; 755b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar}; 765b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 775b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar} // namespace android 785b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar 795b4401b28990107bb797dc0d5f3904cf27417e98Lajos Molnar#endif 80