1bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim/*
2bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * Copyright 2012, The Android Open Source Project
3bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim *
4bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * you may not use this file except in compliance with the License.
6bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * You may obtain a copy of the License at
7bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim *
8bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim *     http://www.apache.org/licenses/LICENSE-2.0
9bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim *
10bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * Unless required by applicable law or agreed to in writing, software
11bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * See the License for the specific language governing permissions and
14bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * limitations under the License.
15bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim */
16bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
17bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#ifndef MEDIA_CODEC_LIST_WRITER_H_
18bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
19bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#define MEDIA_CODEC_LIST_WRITER_H_
20bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
21bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#include <media/stagefright/foundation/ABase.h>
22bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#include <media/stagefright/MediaCodecListWriter.h>
23bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#include <media/MediaCodecInfo.h>
24bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
25bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#include <utils/Errors.h>
26bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#include <utils/StrongPointer.h>
27bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
28bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kimnamespace android {
29bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
30bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim/**
31bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * This class is to be used by a `MediaCodecListBuilderBase` instance to add
32bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * information to the destination `MediaCodecList` object.
33bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim */
34bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kimstruct MediaCodecListWriter {
35bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    /**
36bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * Add a key-value pair to a `MediaCodecList`'s global settings.
37bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     *
38bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * @param key Key.
39bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * @param value Value.
40bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     */
41bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    void addGlobalSetting(const char* key, const char* value);
42bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    /**
43bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * Create an add a new `MediaCodecInfo` object for a `MediaCodecList`, and
44bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * return a `MediaCodecInfoWriter` object associated with the newly added
45bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * `MediaCodecInfo`.
46bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     *
47bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * @return The `MediaCodecInfoWriter` object associated with the newly
48bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * added `MediaCodecInfo` object.
49bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     */
50bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    std::unique_ptr<MediaCodecInfoWriter> addMediaCodecInfo();
51bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kimprivate:
52bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    MediaCodecListWriter() = default;
53bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
54bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    void writeGlobalSettings(const sp<AMessage> &globalSettings) const;
55bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    void writeCodecInfos(std::vector<sp<MediaCodecInfo>> *codecInfos) const;
56bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
57bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    std::vector<std::pair<std::string, std::string>> mGlobalSettings;
58bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    std::vector<sp<MediaCodecInfo>> mCodecInfos;
59bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
60bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    friend struct MediaCodecList;
61bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim};
62bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
63bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim/**
64bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * This interface is to be used by `MediaCodecList` to fill its members with
65bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * appropriate information. `buildMediaCodecList()` will be called from a
66bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim * `MediaCodecList` object during its construction.
67bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim */
68bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kimstruct MediaCodecListBuilderBase {
69bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    /**
70bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * Build the `MediaCodecList` via the given `MediaCodecListWriter` interface.
71bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     *
72bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * @param writer The writer interface.
73bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * @return The status of the construction. `NO_ERROR` means success.
74bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     */
75bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    virtual status_t buildMediaCodecList(MediaCodecListWriter* writer) = 0;
76bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
77bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    /**
78bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     * The default destructor does nothing.
79bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim     */
80bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    virtual ~MediaCodecListBuilderBase() = default;
81bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
82bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim    typedef MediaCodecListBuilderBase *(*CreateBuilderFunc)(void);
83bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim};
84bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
85bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim}  // namespace android
86bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
87bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim#endif  // MEDIA_CODEC_LIST_WRITER_H_
88bc3ad96efdfca9ceaa5ff31b27f7571b32903fdeWonsik Kim
89