1 /*
2  * H.265 video codec.
3  * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de>
4  *
5  * Authors: struktur AG, Dirk Farin <farin@struktur.de>
6  *
7  * This file is part of libde265.
8  *
9  * libde265 is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as
11  * published by the Free Software Foundation, either version 3 of
12  * the License, or (at your option) any later version.
13  *
14  * libde265 is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with libde265.  If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #ifndef IMAGE_IO_H
24 #define IMAGE_IO_H
25 
26 #include "libde265/image.h"
27 #include <deque>
28 
29 
30 class ImageSource
31 {
32  public:
ImageSource()33   LIBDE265_API ImageSource() { }
~ImageSource()34   virtual LIBDE265_API ~ImageSource() { }
35 
36   //enum ImageStatus { Available, Waiting, EndOfVideo };
37 
38   //virtual ImageStatus  get_status() = 0;
39   virtual LIBDE265_API de265_image* get_image(bool block=true) = 0;
40   virtual LIBDE265_API void skip_frames(int n) = 0;
41 
42   virtual LIBDE265_API int get_width() const = 0;
43   virtual LIBDE265_API int get_height() const = 0;
44 };
45 
46 
47 
48 class ImageSource_YUV : public ImageSource
49 {
50  public:
ImageSource_YUV()51  LIBDE265_API ImageSource_YUV() : mFH(NULL) { }
52   virtual LIBDE265_API ~ImageSource_YUV();
53 
54   bool LIBDE265_API set_input_file(const char* filename, int w,int h);
55 
56   //virtual ImageStatus  get_status();
57   virtual LIBDE265_API de265_image* get_image(bool block=true);
58   virtual LIBDE265_API void skip_frames(int n);
59 
get_width()60   virtual LIBDE265_API int get_width() const { return width; }
get_height()61   virtual LIBDE265_API int get_height() const { return height; }
62 
63  private:
64   FILE* mFH;
65   bool mReachedEndOfFile;
66 
67   int width,height;
68 
69   de265_image* read_next_image();
70 };
71 
72 
73 
74 
75 class ImageSink
76 {
77  public:
~ImageSink()78   virtual LIBDE265_API ~ImageSink() { }
79 
80   virtual LIBDE265_API void send_image(const de265_image* img) = 0;
81 };
82 
83 class ImageSink_YUV : public ImageSink
84 {
85  public:
ImageSink_YUV()86  LIBDE265_API ImageSink_YUV() : mFH(NULL) { }
87   LIBDE265_API ~ImageSink_YUV();
88 
89   bool LIBDE265_API set_filename(const char* filename);
90 
91   virtual LIBDE265_API void send_image(const de265_image* img);
92 
93  private:
94   FILE* mFH;
95 };
96 
97 
98 
99 class PacketSink
100 {
101  public:
~PacketSink()102   virtual LIBDE265_API ~PacketSink() { }
103 
104   virtual LIBDE265_API void send_packet(const uint8_t* data, int n) = 0;
105 };
106 
107 
108 class PacketSink_File : public PacketSink
109 {
110  public:
PacketSink_File()111  LIBDE265_API PacketSink_File() : mFH(NULL) { }
112   virtual LIBDE265_API ~PacketSink_File();
113 
114   LIBDE265_API void set_filename(const char* filename);
115 
116   virtual LIBDE265_API void send_packet(const uint8_t* data, int n);
117 
118  private:
119   FILE* mFH;
120 };
121 
122 #endif
123