Fix read_packet() return value on error or EOF

Fix warning on error or EOF:

> Invalid return value 0 for stream protocol

See <http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a606f27f4c610708fa96e35eed7b7537d3d8f712>.

Fixes <https://github.com/Genymobile/scrcpy/issues/333>.
This commit is contained in:
Romain Vimont 2018-11-12 14:37:07 +01:00
parent 6dc6ec05d5
commit 2876463d39

View file

@ -80,12 +80,15 @@ static int read_packet_with_meta(void *opaque, uint8_t *buf, int buf_size) {
if (!state->remaining) { if (!state->remaining) {
#define HEADER_SIZE 12 #define HEADER_SIZE 12
uint8_t header[HEADER_SIZE]; uint8_t header[HEADER_SIZE];
ssize_t ret = net_recv_all(decoder->video_socket, header, HEADER_SIZE); ssize_t r = net_recv_all(decoder->video_socket, header, HEADER_SIZE);
if (ret <= 0) { if (r == -1) {
return ret; return AVERROR(errno);
}
if (r == 0) {
return AVERROR_EOF;
} }
// no partial read (net_recv_all()) // no partial read (net_recv_all())
SDL_assert_release(ret == HEADER_SIZE); SDL_assert_release(r == HEADER_SIZE);
uint64_t pts = buffer_read64be(header); uint64_t pts = buffer_read64be(header);
state->remaining = buffer_read32be(&header[8]); state->remaining = buffer_read32be(&header[8]);
@ -93,7 +96,7 @@ static int read_packet_with_meta(void *opaque, uint8_t *buf, int buf_size) {
if (pts != NO_PTS && !receiver_state_push_meta(state, pts)) { if (pts != NO_PTS && !receiver_state_push_meta(state, pts)) {
LOGE("Could not store PTS for recording"); LOGE("Could not store PTS for recording");
// we cannot save the PTS, the recording would be broken // we cannot save the PTS, the recording would be broken
return -1; return AVERROR(ENOMEM);
} }
} }
@ -102,20 +105,30 @@ static int read_packet_with_meta(void *opaque, uint8_t *buf, int buf_size) {
if (buf_size > state->remaining) if (buf_size > state->remaining)
buf_size = state->remaining; buf_size = state->remaining;
ssize_t ret = net_recv(decoder->video_socket, buf, buf_size); ssize_t r = net_recv(decoder->video_socket, buf, buf_size);
if (ret <= 0) { if (r == -1) {
return ret; return AVERROR(errno);
}
if (r == 0) {
return AVERROR_EOF;
} }
SDL_assert(state->remaining >= ret); SDL_assert(state->remaining >= r);
state->remaining -= ret; state->remaining -= r;
return ret; return r;
} }
static int read_raw_packet(void *opaque, uint8_t *buf, int buf_size) { static int read_raw_packet(void *opaque, uint8_t *buf, int buf_size) {
struct decoder *decoder = opaque; struct decoder *decoder = opaque;
return net_recv(decoder->video_socket, buf, buf_size); ssize_t r = net_recv(decoder->video_socket, buf, buf_size);
if (r == -1) {
return AVERROR(errno);
}
if (r == 0) {
return AVERROR_EOF;
}
return r;
} }
// set the decoded frame as ready for rendering, and notify // set the decoded frame as ready for rendering, and notify