12
12
/** Downcast packet_sink to decoder */
13
13
#define DOWNCAST (SINK ) container_of(SINK, struct sc_decoder, packet_sink)
14
14
15
- static void
16
- sc_decoder_close_first_sinks (struct sc_decoder * decoder , unsigned count ) {
17
- while (count ) {
18
- struct sc_frame_sink * sink = decoder -> sinks [-- count ];
19
- sink -> ops -> close (sink );
20
- }
21
- }
22
-
23
- static inline void
24
- sc_decoder_close_sinks (struct sc_decoder * decoder ) {
25
- sc_decoder_close_first_sinks (decoder , decoder -> sink_count );
26
- }
27
-
28
- static bool
29
- sc_decoder_open_sinks (struct sc_decoder * decoder , const AVCodecContext * ctx ) {
30
- for (unsigned i = 0 ; i < decoder -> sink_count ; ++ i ) {
31
- struct sc_frame_sink * sink = decoder -> sinks [i ];
32
- if (!sink -> ops -> open (sink , ctx )) {
33
- sc_decoder_close_first_sinks (decoder , i );
34
- return false;
35
- }
36
- }
37
-
38
- return true;
39
- }
40
-
41
15
static bool
42
16
sc_decoder_open (struct sc_decoder * decoder , const AVCodec * codec ) {
43
17
decoder -> codec_ctx = avcodec_alloc_context3 (codec );
@@ -77,7 +51,8 @@ sc_decoder_open(struct sc_decoder *decoder, const AVCodec *codec) {
77
51
return false;
78
52
}
79
53
80
- if (!sc_decoder_open_sinks (decoder , decoder -> codec_ctx )) {
54
+ if (!sc_frame_source_sinks_open (& decoder -> frame_source ,
55
+ decoder -> codec_ctx )) {
81
56
av_frame_free (& decoder -> frame );
82
57
avcodec_close (decoder -> codec_ctx );
83
58
avcodec_free_context (& decoder -> codec_ctx );
@@ -89,24 +64,12 @@ sc_decoder_open(struct sc_decoder *decoder, const AVCodec *codec) {
89
64
90
65
static void
91
66
sc_decoder_close (struct sc_decoder * decoder ) {
92
- sc_decoder_close_sinks ( decoder );
67
+ sc_frame_source_sinks_close ( & decoder -> frame_source );
93
68
av_frame_free (& decoder -> frame );
94
69
avcodec_close (decoder -> codec_ctx );
95
70
avcodec_free_context (& decoder -> codec_ctx );
96
71
}
97
72
98
- static bool
99
- push_frame_to_sinks (struct sc_decoder * decoder , const AVFrame * frame ) {
100
- for (unsigned i = 0 ; i < decoder -> sink_count ; ++ i ) {
101
- struct sc_frame_sink * sink = decoder -> sinks [i ];
102
- if (!sink -> ops -> push (sink , frame )) {
103
- return false;
104
- }
105
- }
106
-
107
- return true;
108
- }
109
-
110
73
static bool
111
74
sc_decoder_push (struct sc_decoder * decoder , const AVPacket * packet ) {
112
75
bool is_config = packet -> pts == AV_NOPTS_VALUE ;
@@ -135,7 +98,8 @@ sc_decoder_push(struct sc_decoder *decoder, const AVPacket *packet) {
135
98
}
136
99
137
100
// a frame was received
138
- bool ok = push_frame_to_sinks (decoder , decoder -> frame );
101
+ bool ok = sc_frame_source_sinks_push (& decoder -> frame_source ,
102
+ decoder -> frame );
139
103
// A frame lost should not make the whole pipeline fail. The error, if
140
104
// any, is already logged.
141
105
(void ) ok ;
@@ -168,7 +132,7 @@ sc_decoder_packet_sink_push(struct sc_packet_sink *sink,
168
132
void
169
133
sc_decoder_init (struct sc_decoder * decoder , const char * name ) {
170
134
decoder -> name = name ; // statically allocated
171
- decoder -> sink_count = 0 ;
135
+ sc_frame_source_init ( & decoder -> frame_source ) ;
172
136
173
137
static const struct sc_packet_sink_ops ops = {
174
138
.open = sc_decoder_packet_sink_open ,
@@ -178,11 +142,3 @@ sc_decoder_init(struct sc_decoder *decoder, const char *name) {
178
142
179
143
decoder -> packet_sink .ops = & ops ;
180
144
}
181
-
182
- void
183
- sc_decoder_add_sink (struct sc_decoder * decoder , struct sc_frame_sink * sink ) {
184
- assert (decoder -> sink_count < SC_DECODER_MAX_SINKS );
185
- assert (sink );
186
- assert (sink -> ops );
187
- decoder -> sinks [decoder -> sink_count ++ ] = sink ;
188
- }
0 commit comments