|
|
|
@ -1132,7 +1132,63 @@ static void video_audio_display(VideoState *s) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void stream_component_close(VideoState *is, int stream_index); |
|
|
|
|
static void stream_component_close(VideoState *is, int stream_index) |
|
|
|
|
{ |
|
|
|
|
AVFormatContext *ic = is->ic; |
|
|
|
|
AVCodecContext *avctx; |
|
|
|
|
|
|
|
|
|
if (stream_index < 0 || stream_index >= ic->nb_streams) |
|
|
|
|
return; |
|
|
|
|
avctx = ic->streams[stream_index]->codec; |
|
|
|
|
|
|
|
|
|
switch (avctx->codec_type) { |
|
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
|
decoder_abort(&is->auddec, &is->sampq); |
|
|
|
|
SDL_CloseAudio(); |
|
|
|
|
decoder_destroy(&is->auddec); |
|
|
|
|
swr_free(&is->swr_ctx); |
|
|
|
|
av_freep(&is->audio_buf1); |
|
|
|
|
is->audio_buf1_size = 0; |
|
|
|
|
is->audio_buf = NULL; |
|
|
|
|
|
|
|
|
|
if (is->rdft) { |
|
|
|
|
av_rdft_end(is->rdft); |
|
|
|
|
av_freep(&is->rdft_data); |
|
|
|
|
is->rdft = NULL; |
|
|
|
|
is->rdft_bits = 0; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
decoder_abort(&is->viddec, &is->pictq); |
|
|
|
|
decoder_destroy(&is->viddec); |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_SUBTITLE: |
|
|
|
|
decoder_abort(&is->subdec, &is->subpq); |
|
|
|
|
decoder_destroy(&is->subdec); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ic->streams[stream_index]->discard = AVDISCARD_ALL; |
|
|
|
|
avcodec_close(avctx); |
|
|
|
|
switch (avctx->codec_type) { |
|
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
|
is->audio_st = NULL; |
|
|
|
|
is->audio_stream = -1; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
is->video_st = NULL; |
|
|
|
|
is->video_stream = -1; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_SUBTITLE: |
|
|
|
|
is->subtitle_st = NULL; |
|
|
|
|
is->subtitle_stream = -1; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void stream_close(VideoState *is) |
|
|
|
|
{ |
|
|
|
@ -2737,64 +2793,6 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void stream_component_close(VideoState *is, int stream_index) |
|
|
|
|
{ |
|
|
|
|
AVFormatContext *ic = is->ic; |
|
|
|
|
AVCodecContext *avctx; |
|
|
|
|
|
|
|
|
|
if (stream_index < 0 || stream_index >= ic->nb_streams) |
|
|
|
|
return; |
|
|
|
|
avctx = ic->streams[stream_index]->codec; |
|
|
|
|
|
|
|
|
|
switch (avctx->codec_type) { |
|
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
|
decoder_abort(&is->auddec, &is->sampq); |
|
|
|
|
SDL_CloseAudio(); |
|
|
|
|
decoder_destroy(&is->auddec); |
|
|
|
|
swr_free(&is->swr_ctx); |
|
|
|
|
av_freep(&is->audio_buf1); |
|
|
|
|
is->audio_buf1_size = 0; |
|
|
|
|
is->audio_buf = NULL; |
|
|
|
|
|
|
|
|
|
if (is->rdft) { |
|
|
|
|
av_rdft_end(is->rdft); |
|
|
|
|
av_freep(&is->rdft_data); |
|
|
|
|
is->rdft = NULL; |
|
|
|
|
is->rdft_bits = 0; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
decoder_abort(&is->viddec, &is->pictq); |
|
|
|
|
decoder_destroy(&is->viddec); |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_SUBTITLE: |
|
|
|
|
decoder_abort(&is->subdec, &is->subpq); |
|
|
|
|
decoder_destroy(&is->subdec); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ic->streams[stream_index]->discard = AVDISCARD_ALL; |
|
|
|
|
avcodec_close(avctx); |
|
|
|
|
switch (avctx->codec_type) { |
|
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
|
is->audio_st = NULL; |
|
|
|
|
is->audio_stream = -1; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
is->video_st = NULL; |
|
|
|
|
is->video_stream = -1; |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_SUBTITLE: |
|
|
|
|
is->subtitle_st = NULL; |
|
|
|
|
is->subtitle_stream = -1; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int decode_interrupt_cb(void *ctx) |
|
|
|
|
{ |
|
|
|
|
VideoState *is = ctx; |
|
|
|
|