Skip to content

Commit d835a7a

Browse files
committed
Use frame source trait in decoder
1 parent 51b89a5 commit d835a7a

File tree

3 files changed

+14
-61
lines changed

3 files changed

+14
-61
lines changed

app/src/decoder.c

+6-50
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,6 @@
1212
/** Downcast packet_sink to decoder */
1313
#define DOWNCAST(SINK) container_of(SINK, struct sc_decoder, packet_sink)
1414

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-
4115
static bool
4216
sc_decoder_open(struct sc_decoder *decoder, const AVCodec *codec) {
4317
decoder->codec_ctx = avcodec_alloc_context3(codec);
@@ -77,7 +51,8 @@ sc_decoder_open(struct sc_decoder *decoder, const AVCodec *codec) {
7751
return false;
7852
}
7953

80-
if (!sc_decoder_open_sinks(decoder, decoder->codec_ctx)) {
54+
if (!sc_frame_source_sinks_open(&decoder->frame_source,
55+
decoder->codec_ctx)) {
8156
av_frame_free(&decoder->frame);
8257
avcodec_close(decoder->codec_ctx);
8358
avcodec_free_context(&decoder->codec_ctx);
@@ -89,24 +64,12 @@ sc_decoder_open(struct sc_decoder *decoder, const AVCodec *codec) {
8964

9065
static void
9166
sc_decoder_close(struct sc_decoder *decoder) {
92-
sc_decoder_close_sinks(decoder);
67+
sc_frame_source_sinks_close(&decoder->frame_source);
9368
av_frame_free(&decoder->frame);
9469
avcodec_close(decoder->codec_ctx);
9570
avcodec_free_context(&decoder->codec_ctx);
9671
}
9772

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-
11073
static bool
11174
sc_decoder_push(struct sc_decoder *decoder, const AVPacket *packet) {
11275
bool is_config = packet->pts == AV_NOPTS_VALUE;
@@ -135,7 +98,8 @@ sc_decoder_push(struct sc_decoder *decoder, const AVPacket *packet) {
13598
}
13699

137100
// 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);
139103
// A frame lost should not make the whole pipeline fail. The error, if
140104
// any, is already logged.
141105
(void) ok;
@@ -168,7 +132,7 @@ sc_decoder_packet_sink_push(struct sc_packet_sink *sink,
168132
void
169133
sc_decoder_init(struct sc_decoder *decoder, const char *name) {
170134
decoder->name = name; // statically allocated
171-
decoder->sink_count = 0;
135+
sc_frame_source_init(&decoder->frame_source);
172136

173137
static const struct sc_packet_sink_ops ops = {
174138
.open = sc_decoder_packet_sink_open,
@@ -178,11 +142,3 @@ sc_decoder_init(struct sc_decoder *decoder, const char *name) {
178142

179143
decoder->packet_sink.ops = &ops;
180144
}
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-
}

app/src/decoder.h

+2-8
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,19 @@
33

44
#include "common.h"
55

6+
#include "trait/frame_source.h"
67
#include "trait/packet_sink.h"
78

89
#include <stdbool.h>
910
#include <libavcodec/avcodec.h>
1011
#include <libavformat/avformat.h>
1112

12-
#define SC_DECODER_MAX_SINKS 2
13-
1413
struct sc_decoder {
1514
struct sc_packet_sink packet_sink; // packet sink trait
15+
struct sc_frame_source frame_source; // frame source trait
1616

1717
const char *name; // must be statically allocated (e.g. a string literal)
1818

19-
struct sc_frame_sink *sinks[SC_DECODER_MAX_SINKS];
20-
unsigned sink_count;
21-
2219
AVCodecContext *codec_ctx;
2320
AVFrame *frame;
2421
};
@@ -27,7 +24,4 @@ struct sc_decoder {
2724
void
2825
sc_decoder_init(struct sc_decoder *decoder, const char *name);
2926

30-
void
31-
sc_decoder_add_sink(struct sc_decoder *decoder, struct sc_frame_sink *sink);
32-
3327
#endif

app/src/scrcpy.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -681,11 +681,13 @@ scrcpy(struct scrcpy_options *options) {
681681
}
682682
screen_initialized = true;
683683

684-
sc_decoder_add_sink(&s->video_decoder, &s->screen.frame_sink);
684+
sc_frame_source_add_sink(&s->video_decoder.frame_source,
685+
&s->screen.frame_sink);
685686

686687
if (options->audio) {
687688
sc_audio_player_init(&s->audio_player);
688-
sc_decoder_add_sink(&s->audio_decoder, &s->audio_player.frame_sink);
689+
sc_frame_source_add_sink(&s->audio_decoder.frame_source,
690+
&s->audio_player.frame_sink);
689691
}
690692
}
691693

@@ -696,7 +698,8 @@ scrcpy(struct scrcpy_options *options) {
696698
goto end;
697699
}
698700

699-
sc_decoder_add_sink(&s->video_decoder, &s->v4l2_sink.frame_sink);
701+
sc_frame_source_add_sink(&s->video_decoder.frame_source,
702+
&s->v4l2_sink.frame_sink);
700703

701704
v4l2_sink_initialized = true;
702705
}

0 commit comments

Comments
 (0)