• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 #pragma once
15 
16 #include "host-common/GoldfishMediaDefs.h"
17 #include "host-common/MediaCodec.h"
18 #include "host-common/MediaVpxDecoderPlugin.h"
19 #include "host-common/VpxPingInfoParser.h"
20 
21 #include <inttypes.h>
22 #include <stddef.h>
23 #include <memory>
24 #include <mutex>
25 #include <unordered_map>
26 
27 namespace android {
28 namespace emulation {
29 
30 class MediaVpxDecoder : MediaCodec {
31 public:
32     using InitContextParam = VpxPingInfoParser::InitContextParam;
33     using DecodeFrameParam = VpxPingInfoParser::DecodeFrameParam;
34     using GetImageParam = VpxPingInfoParser::GetImageParam;
35 
36     MediaVpxDecoder() = default;
37     virtual ~MediaVpxDecoder() = default;
38     void handlePing(MediaCodecType type, MediaOperation op, void* ptr) override;
39 
40 public:
41     virtual void save(base::Stream* stream) const override;
42     virtual bool load(base::Stream* stream) override;
43 
44 public:
45     void initVpxContext(void *ptr, MediaCodecType type);
46     void destroyVpxContext(void *ptr);
47     void decodeFrame(void* ptr);
48     void flush(void* ptr);
49     void getImage(void* ptr);
50 
51 private:
52     std::mutex mMapLock{};
53     uint64_t mId = 0;
54     std::unordered_map<uint64_t, MediaVpxDecoderPlugin*> mDecoders;
55     uint64_t readId(void* ptr);  // read id from the address
56     void removeDecoder(uint64_t id);
57     void addDecoder(uint64_t key,
58                     MediaVpxDecoderPlugin* val);  // this just add
59     void updateDecoder(uint64_t key,
60                        MediaVpxDecoderPlugin* val);  // this will overwrite
61     MediaVpxDecoderPlugin* getDecoder(uint64_t key);
62 };
63 
64 }  // namespace emulation
65 }  // namespace android
66