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