Stop stream immediately on quit
If the stream is stopped, av_read_frame() will be woken up and yield a corrupted packet. Do not try to decode or record it.
This commit is contained in:
parent
47f1003200
commit
3b4366e5bf
2 changed files with 11 additions and 0 deletions
|
@ -207,6 +207,13 @@ run_stream(void *data) {
|
||||||
packet.size = 0;
|
packet.size = 0;
|
||||||
|
|
||||||
while (!av_read_frame(format_ctx, &packet)) {
|
while (!av_read_frame(format_ctx, &packet)) {
|
||||||
|
if (SDL_AtomicGet(&stream->stopped)) {
|
||||||
|
// if the stream is stopped, the socket had been shutdown, so the
|
||||||
|
// last packet is probably corrupted (but not detected as such by
|
||||||
|
// FFmpeg) and will not be decoded correctly
|
||||||
|
av_packet_unref(&packet);
|
||||||
|
goto quit;
|
||||||
|
}
|
||||||
if (stream->decoder && !decoder_push(stream->decoder, &packet)) {
|
if (stream->decoder && !decoder_push(stream->decoder, &packet)) {
|
||||||
av_packet_unref(&packet);
|
av_packet_unref(&packet);
|
||||||
goto quit;
|
goto quit;
|
||||||
|
@ -259,6 +266,7 @@ stream_init(struct stream *stream, socket_t socket,
|
||||||
stream->socket = socket;
|
stream->socket = socket;
|
||||||
stream->decoder = decoder,
|
stream->decoder = decoder,
|
||||||
stream->recorder = recorder;
|
stream->recorder = recorder;
|
||||||
|
SDL_AtomicSet(&stream->stopped, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -275,6 +283,7 @@ stream_start(struct stream *stream) {
|
||||||
|
|
||||||
void
|
void
|
||||||
stream_stop(struct stream *stream) {
|
stream_stop(struct stream *stream) {
|
||||||
|
SDL_AtomicSet(&stream->stopped, 1);
|
||||||
if (stream->decoder) {
|
if (stream->decoder) {
|
||||||
decoder_interrupt(stream->decoder);
|
decoder_interrupt(stream->decoder);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <SDL2/SDL_atomic.h>
|
||||||
#include <SDL2/SDL_thread.h>
|
#include <SDL2/SDL_thread.h>
|
||||||
|
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
@ -18,6 +19,7 @@ struct stream {
|
||||||
socket_t socket;
|
socket_t socket;
|
||||||
struct video_buffer *video_buffer;
|
struct video_buffer *video_buffer;
|
||||||
SDL_Thread *thread;
|
SDL_Thread *thread;
|
||||||
|
SDL_atomic_t stopped;
|
||||||
struct decoder *decoder;
|
struct decoder *decoder;
|
||||||
struct recorder *recorder;
|
struct recorder *recorder;
|
||||||
struct receiver_state {
|
struct receiver_state {
|
||||||
|
|
Loading…
Reference in a new issue