Open and close the file in the main thread in alffplay
This avoid problems with the file being closed while a video refresh is still scheduled.
This commit is contained in:
parent
be66692f94
commit
8ca1f4f371
@ -1117,7 +1117,7 @@ static int decode_interrupt_cb(void *ctx)
|
|||||||
int decode_thread(void *arg)
|
int decode_thread(void *arg)
|
||||||
{
|
{
|
||||||
MovieState *movState = (MovieState *)arg;
|
MovieState *movState = (MovieState *)arg;
|
||||||
AVFormatContext *fmtCtx;
|
AVFormatContext *fmtCtx = movState->pFormatCtx;
|
||||||
AVPacket *packet = (AVPacket[1]){};
|
AVPacket *packet = (AVPacket[1]){};
|
||||||
int video_index = -1;
|
int video_index = -1;
|
||||||
int audio_index = -1;
|
int audio_index = -1;
|
||||||
@ -1125,30 +1125,6 @@ int decode_thread(void *arg)
|
|||||||
movState->videoStream = -1;
|
movState->videoStream = -1;
|
||||||
movState->audioStream = -1;
|
movState->audioStream = -1;
|
||||||
|
|
||||||
fmtCtx = avformat_alloc_context();
|
|
||||||
fmtCtx->interrupt_callback = (AVIOInterruptCB){.callback=decode_interrupt_cb, .opaque=movState};
|
|
||||||
|
|
||||||
if(avio_open2(&fmtCtx->pb, movState->filename, AVIO_FLAG_READ, &fmtCtx->interrupt_callback, NULL))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to open %s\n", movState->filename);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open movie file */
|
|
||||||
if(avformat_open_input(&fmtCtx, movState->filename, NULL, NULL) != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to open %s\n", movState->filename);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
movState->pFormatCtx = fmtCtx;
|
|
||||||
|
|
||||||
/* Retrieve stream information */
|
|
||||||
if(avformat_find_stream_info(fmtCtx, NULL) < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: failed to find stream info\n", movState->filename);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dump information about file onto standard error */
|
/* Dump information about file onto standard error */
|
||||||
av_dump_format(fmtCtx, 0, movState->filename, 0);
|
av_dump_format(fmtCtx, 0, movState->filename, 0);
|
||||||
|
|
||||||
@ -1259,7 +1235,6 @@ fail:
|
|||||||
if(movState->audioStream >= 0)
|
if(movState->audioStream >= 0)
|
||||||
althrd_join(movState->audio.thread, NULL);
|
althrd_join(movState->audio.thread, NULL);
|
||||||
|
|
||||||
avformat_close_input(&movState->pFormatCtx);
|
|
||||||
SDL_PushEvent(&(SDL_Event){ .user={.type=FF_QUIT_EVENT, .data1=movState} });
|
SDL_PushEvent(&(SDL_Event){ .user={.type=FF_QUIT_EVENT, .data1=movState} });
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1389,8 +1364,33 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
movState->av_sync_type = DEFAULT_AV_SYNC_TYPE;
|
movState->av_sync_type = DEFAULT_AV_SYNC_TYPE;
|
||||||
|
|
||||||
|
movState->pFormatCtx = avformat_alloc_context();
|
||||||
|
movState->pFormatCtx->interrupt_callback = (AVIOInterruptCB){.callback=decode_interrupt_cb, .opaque=movState};
|
||||||
|
|
||||||
|
if(avio_open2(&movState->pFormatCtx->pb, movState->filename, AVIO_FLAG_READ,
|
||||||
|
&movState->pFormatCtx->interrupt_callback, NULL))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to open %s\n", movState->filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open movie file */
|
||||||
|
if(avformat_open_input(&movState->pFormatCtx, movState->filename, NULL, NULL) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to open %s\n", movState->filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Retrieve stream information */
|
||||||
|
if(avformat_find_stream_info(movState->pFormatCtx, NULL) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: failed to find stream info\n", movState->filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
schedule_refresh(movState, 40);
|
schedule_refresh(movState, 40);
|
||||||
|
|
||||||
|
|
||||||
if(althrd_create(&movState->parse_thread, decode_thread, movState) != althrd_success)
|
if(althrd_create(&movState->parse_thread, decode_thread, movState) != althrd_success)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Failed to create parse thread!\n");
|
fprintf(stderr, "Failed to create parse thread!\n");
|
||||||
@ -1453,6 +1453,8 @@ int main(int argc, char *argv[])
|
|||||||
case FF_QUIT_EVENT:
|
case FF_QUIT_EVENT:
|
||||||
althrd_join(movState->parse_thread, NULL);
|
althrd_join(movState->parse_thread, NULL);
|
||||||
|
|
||||||
|
avformat_close_input(&movState->pFormatCtx);
|
||||||
|
|
||||||
almtx_destroy(&movState->audio.src_mutex);
|
almtx_destroy(&movState->audio.src_mutex);
|
||||||
almtx_destroy(&movState->video.pictq_mutex);
|
almtx_destroy(&movState->video.pictq_mutex);
|
||||||
alcnd_destroy(&movState->video.pictq_cond);
|
alcnd_destroy(&movState->video.pictq_cond);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user