hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
#ifndef EASYMEDIA_CODEC_H_
#define EASYMEDIA_CODEC_H_
 
#include <list>
#include <memory>
 
#include "media_config.h"
 
namespace easymedia
{
 
    class MediaBuffer;
    class Codec
    {
      public:
        Codec();
        virtual ~Codec() = 0;
        static const char* GetCodecName()
        {
            return nullptr;
        }
        MediaConfig& GetConfig()
        {
            return config;
        }
        void SetConfig(const MediaConfig& cfg)
        {
            config = cfg;
        }
        _API std::shared_ptr<MediaBuffer> GetExtraData(void** data = nullptr, size_t* size = nullptr);
        _API bool SetExtraData(void* data, size_t size, bool realloc = true);
        void SetExtraData(const std::shared_ptr<MediaBuffer>& data)
        {
            extra_data = data;
        }
 
        virtual bool Init() = 0;
        // sync call, input and output must be valid
        virtual int Process(const std::shared_ptr<MediaBuffer>& input, std::shared_ptr<MediaBuffer>& output,
                            std::shared_ptr<MediaBuffer> extra_output = nullptr) = 0;
 
        // some codec may output many buffers with one input.
        // sync or async safe call, depends on specific codec.
        virtual int SendInput(const std::shared_ptr<MediaBuffer>& input) = 0;
        virtual std::shared_ptr<MediaBuffer> FetchOutput() = 0;
 
      private:
        MediaConfig config;
        std::shared_ptr<MediaBuffer> extra_data;
    };
 
    _API const uint8_t* find_nalu_startcode(const uint8_t* p, const uint8_t* end);
    // must be h264 data
    _API std::list<std::shared_ptr<MediaBuffer>> split_h264_separate(const uint8_t* buffer, size_t length,
                                                                     int64_t timestamp);
    _API std::list<std::shared_ptr<MediaBuffer>> split_h265_separate(const uint8_t* buffer, size_t length,
                                                                     int64_t timestamp);
    _API void* GetVpsFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
    _API void* GetSpsFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
    _API void* GetPpsFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
    _API void* GetSpsPpsFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
    _API void* GetVpsSpsPpsFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
    _API void* GetSeiFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
    _API void* GetIntraFromBuffer(std::shared_ptr<MediaBuffer>& mb, int& size, CodecType c_type);
 
} // namespace easymedia
 
#endif // #ifndef EASYMEDIA_CODEC_H_