diff options
Diffstat (limited to 'src/kitsource.c')
-rw-r--r-- | src/kitsource.c | 172 |
1 files changed, 89 insertions, 83 deletions
diff --git a/src/kitsource.c b/src/kitsource.c index d8cfe53..b79207e 100644 --- a/src/kitsource.c +++ b/src/kitsource.c @@ -9,108 +9,114 @@ #include <assert.h> Kit_Source* Kit_CreateSourceFromUrl(const char *url) { - assert(url != NULL); - - AVFormatContext *format_ctx = NULL; - - // Attempt to open source - if(avformat_open_input(&format_ctx, url, NULL, NULL) < 0) { - Kit_SetError("Unable to open source Url"); - goto exit_0; - } - - // Fetch stream information. This may potentially take a while. - if(avformat_find_stream_info(format_ctx, NULL) < 0) { - Kit_SetError("Unable to fetch source information"); - goto exit_1; - } - - // Find best streams for defaults - int best_astream_idx = av_find_best_stream(format_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0); - int best_vstream_idx = av_find_best_stream(format_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); - - // Allocate and return a new source - // TODO: Check allocation errors - Kit_Source *out = calloc(1, sizeof(Kit_Source)); - out->format_ctx = format_ctx; - out->astream_idx = best_astream_idx; - out->vstream_idx = best_vstream_idx; - return out; + assert(url != NULL); + + Kit_Source *src = calloc(1, sizeof(Kit_Source)); + if(src == NULL) { + Kit_SetError("Unable to allocate source"); + return NULL; + } + + // Attempt to open source + if(avformat_open_input((AVFormatContext **)&src->format_ctx, url, NULL, NULL) < 0) { + Kit_SetError("Unable to open source Url"); + goto exit_0; + } + + // Fetch stream information. This may potentially take a while. + if(avformat_find_stream_info((AVFormatContext *)src->format_ctx, NULL) < 0) { + Kit_SetError("Unable to fetch source information"); + goto exit_1; + } + + // Find best streams for defaults + src->astream_idx = Kit_GetBestSourceStream(src, KIT_STREAMTYPE_AUDIO); + src->vstream_idx = Kit_GetBestSourceStream(src, KIT_STREAMTYPE_VIDEO); + return src; exit_1: - avformat_close_input(&format_ctx); + avformat_close_input((AVFormatContext **)&src->format_ctx); exit_0: - return NULL; + free(src); + return NULL; } void Kit_CloseSource(Kit_Source *src) { - assert(src != NULL); - avformat_close_input((AVFormatContext **)&src->format_ctx); - free(src); + assert(src != NULL); + avformat_close_input((AVFormatContext **)&src->format_ctx); + free(src); } int Kit_GetSourceStreamInfo(const Kit_Source *src, Kit_StreamInfo *info, int index) { - assert(src != NULL); - assert(info != NULL); - - AVFormatContext *format_ctx = (AVFormatContext *)src->format_ctx; - if(index < 0 || index >= format_ctx->nb_streams) { - Kit_SetError("Invalid stream index"); - return 1; - } - - AVStream *stream = format_ctx->streams[index]; - switch(stream->codec->codec_type) { - case AVMEDIA_TYPE_UNKNOWN: info->type = KIT_STREAMTYPE_UNKNOWN; break; - case AVMEDIA_TYPE_DATA: info->type = KIT_STREAMTYPE_DATA; break; - case AVMEDIA_TYPE_VIDEO: info->type = KIT_STREAMTYPE_VIDEO; break; - case AVMEDIA_TYPE_AUDIO: info->type = KIT_STREAMTYPE_AUDIO; break; - case AVMEDIA_TYPE_SUBTITLE: info->type = KIT_STREAMTYPE_SUBTITLE; break; - case AVMEDIA_TYPE_ATTACHMENT: info->type = KIT_STREAMTYPE_ATTACHMENT; break; - default: - Kit_SetError("Unknown native stream type"); - return 1; - } - - info->index = index; - return 0; + assert(src != NULL); + assert(info != NULL); + + AVFormatContext *format_ctx = (AVFormatContext *)src->format_ctx; + if(index < 0 || index >= format_ctx->nb_streams) { + Kit_SetError("Invalid stream index"); + return 1; + } + + AVStream *stream = format_ctx->streams[index]; + switch(stream->codec->codec_type) { + case AVMEDIA_TYPE_UNKNOWN: info->type = KIT_STREAMTYPE_UNKNOWN; break; + case AVMEDIA_TYPE_DATA: info->type = KIT_STREAMTYPE_DATA; break; + case AVMEDIA_TYPE_VIDEO: info->type = KIT_STREAMTYPE_VIDEO; break; + case AVMEDIA_TYPE_AUDIO: info->type = KIT_STREAMTYPE_AUDIO; break; + case AVMEDIA_TYPE_SUBTITLE: info->type = KIT_STREAMTYPE_SUBTITLE; break; + case AVMEDIA_TYPE_ATTACHMENT: info->type = KIT_STREAMTYPE_ATTACHMENT; break; + default: + Kit_SetError("Unknown native stream type"); + return 1; + } + + info->index = index; + return 0; } int Kit_GetBestSourceStream(const Kit_Source *src, const Kit_streamtype type) { - assert(src != NULL); - int avmedia_type = 0; - switch(type) { - case KIT_STREAMTYPE_VIDEO: avmedia_type = AVMEDIA_TYPE_VIDEO; break; - case KIT_STREAMTYPE_AUDIO: avmedia_type = AVMEDIA_TYPE_AUDIO; break; - default: return -1; - } - return av_find_best_stream((AVFormatContext *)src->format_ctx, avmedia_type, -1, -1, NULL, 0); + assert(src != NULL); + int avmedia_type = 0; + switch(type) { + case KIT_STREAMTYPE_VIDEO: avmedia_type = AVMEDIA_TYPE_VIDEO; break; + case KIT_STREAMTYPE_AUDIO: avmedia_type = AVMEDIA_TYPE_AUDIO; break; + default: return -1; + } + int ret = av_find_best_stream((AVFormatContext *)src->format_ctx, avmedia_type, -1, -1, NULL, 0); + if(ret == AVERROR_STREAM_NOT_FOUND) { + return -1; + } + if(ret == AVERROR_DECODER_NOT_FOUND) { + Kit_SetError("Unable to find a decoder for the stream"); + return 1; + } + return ret; } int Kit_SetSourceStream(Kit_Source *src, const Kit_streamtype type, int index) { - assert(src != NULL); - switch(type) { - case KIT_STREAMTYPE_AUDIO: src->astream_idx = index; break; - case KIT_STREAMTYPE_VIDEO: src->vstream_idx = index; break; - default: - Kit_SetError("Invalid stream type"); - return 1; - } - return 0; + assert(src != NULL); + switch(type) { + case KIT_STREAMTYPE_AUDIO: src->astream_idx = index; break; + case KIT_STREAMTYPE_VIDEO: src->vstream_idx = index; break; + default: + Kit_SetError("Invalid stream type"); + return 1; + } + return 0; } int Kit_GetSourceStream(const Kit_Source *src, const Kit_streamtype type) { - assert(src != NULL); - switch(type) { - case KIT_STREAMTYPE_AUDIO: return src->astream_idx; - case KIT_STREAMTYPE_VIDEO: return src->vstream_idx; - default: - break; - } - return -1; + assert(src != NULL); + switch(type) { + case KIT_STREAMTYPE_AUDIO: return src->astream_idx; + case KIT_STREAMTYPE_VIDEO: return src->vstream_idx; + default: + break; + } + return -1; } int Kit_GetSourceStreamCount(const Kit_Source *src) { - assert(src != NULL); - return ((AVFormatContext *)src->format_ctx)->nb_streams; + assert(src != NULL); + return ((AVFormatContext *)src->format_ctx)->nb_streams; } |