forbid codec options which would not render in a browser
This commit is contained in:
parent
9a614820f0
commit
e7bf79289e
|
@ -1,4 +1,5 @@
|
|||
#include <libavformat/avformat.h>
|
||||
#include <libavutil/pixdesc.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -7,6 +8,50 @@
|
|||
const AVRational t_1h = { 3600, 1 };
|
||||
const AVRational t_0h = { 0, 1 };
|
||||
|
||||
static int validate_video_pixel_format(enum AVPixelFormat format)
|
||||
{
|
||||
switch (format) {
|
||||
// Still image formats
|
||||
case AV_PIX_FMT_RGB8:
|
||||
case AV_PIX_FMT_RGB24:
|
||||
case AV_PIX_FMT_RGB32:
|
||||
case AV_PIX_FMT_RGB48:
|
||||
case AV_PIX_FMT_RGBA:
|
||||
|
||||
// Video frame formats
|
||||
case AV_PIX_FMT_YUV420P:
|
||||
case AV_PIX_FMT_YUVJ420P:
|
||||
case AV_PIX_FMT_YUV420P10LE:
|
||||
case AV_PIX_FMT_YUV422P:
|
||||
case AV_PIX_FMT_YUV422P10LE:
|
||||
case AV_PIX_FMT_YUV444P:
|
||||
case AV_PIX_FMT_YUV444P10LE:
|
||||
case AV_PIX_FMT_YUV420P12LE:
|
||||
case AV_PIX_FMT_YUV422P12LE:
|
||||
case AV_PIX_FMT_YUV444P12LE:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int validate_audio_sample_format(enum AVSampleFormat format)
|
||||
{
|
||||
switch (format) {
|
||||
case AV_SAMPLE_FMT_FLT:
|
||||
case AV_SAMPLE_FMT_FLTP:
|
||||
case AV_SAMPLE_FMT_S16:
|
||||
case AV_SAMPLE_FMT_S16P:
|
||||
case AV_SAMPLE_FMT_S32:
|
||||
case AV_SAMPLE_FMT_S32P:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int mediatools_validate_video(AVFormatContext *format)
|
||||
{
|
||||
uint64_t num_vstreams = 0;
|
||||
|
@ -15,13 +60,31 @@ int mediatools_validate_video(AVFormatContext *format)
|
|||
int64_t astream_idx = -1;
|
||||
|
||||
for (size_t i = 0; i < format->nb_streams; ++i) {
|
||||
if (format->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
AVCodecParameters *codecpar = format->streams[i]->codecpar;
|
||||
|
||||
if (codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
num_vstreams++;
|
||||
vstream_idx = i;
|
||||
}
|
||||
if (format->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
|
||||
if (!validate_video_pixel_format(codecpar->format)) {
|
||||
printf("Found unsupported pixel format %s\n", av_get_pix_fmt_name(codecpar->format));
|
||||
return false;
|
||||
}
|
||||
|
||||
} else if (codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
num_astreams++;
|
||||
astream_idx = i;
|
||||
|
||||
if (!validate_audio_sample_format(codecpar->format)) {
|
||||
printf("Found unsupported audio sample format %s\n", av_get_sample_fmt_name(codecpar->format));
|
||||
return false;
|
||||
}
|
||||
|
||||
} else if (codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
||||
// Allow subtitles
|
||||
} else {
|
||||
printf("Unknown codec type %s\n", av_get_media_type_string(codecpar->codec_type));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue