mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avformat/dashenc: Set VP9 codec string with profile, level and bitdepth
Otherwise some versions of chrome browser returns "codec not supported" error
This commit is contained in:
parent
5b6cc3a73a
commit
060e74e2a9
@ -45,6 +45,7 @@
|
||||
#include "isom.h"
|
||||
#include "os_support.h"
|
||||
#include "url.h"
|
||||
#include "vpcc.h"
|
||||
#include "dash.h"
|
||||
|
||||
typedef struct Segment {
|
||||
@ -170,8 +171,23 @@ static void dashenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filenam
|
||||
}
|
||||
}
|
||||
|
||||
static void set_vp9_codec_str(AVFormatContext *s, AVCodecParameters *par,
|
||||
AVRational *frame_rate, char *str, int size) {
|
||||
VPCC vpcc;
|
||||
int ret = ff_isom_get_vpcc_features(s, par, frame_rate, &vpcc);
|
||||
if (ret == 0) {
|
||||
av_strlcatf(str, size, "vp09.%02x.%02x.%02x",
|
||||
vpcc.profile, vpcc.level, vpcc.bitdepth);
|
||||
} else {
|
||||
// Default to just vp9 in case of error while finding out profile or level
|
||||
av_log(s, AV_LOG_WARNING, "Could not find VP9 profile and/or level\n");
|
||||
av_strlcpy(str, "vp9", size);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static void set_codec_str(AVFormatContext *s, AVCodecParameters *par,
|
||||
char *str, int size)
|
||||
AVRational *frame_rate, char *str, int size)
|
||||
{
|
||||
const AVCodecTag *tags[2] = { NULL, NULL };
|
||||
uint32_t tag;
|
||||
@ -180,7 +196,11 @@ static void set_codec_str(AVFormatContext *s, AVCodecParameters *par,
|
||||
// common Webm codecs are not part of RFC 6381
|
||||
for (i = 0; codecs[i].id; i++)
|
||||
if (codecs[i].id == par->codec_id) {
|
||||
av_strlcpy(str, codecs[i].str, size);
|
||||
if (codecs[i].id == AV_CODEC_ID_VP9) {
|
||||
set_vp9_codec_str(s, par, frame_rate, str, size);
|
||||
} else {
|
||||
av_strlcpy(str, codecs[i].str, size);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1032,7 +1052,8 @@ static int dash_init(AVFormatContext *s)
|
||||
c->has_video = 1;
|
||||
}
|
||||
|
||||
set_codec_str(s, st->codecpar, os->codec_str, sizeof(os->codec_str));
|
||||
set_codec_str(s, st->codecpar, &st->avg_frame_rate, os->codec_str,
|
||||
sizeof(os->codec_str));
|
||||
os->first_pts = AV_NOPTS_VALUE;
|
||||
os->max_pts = AV_NOPTS_VALUE;
|
||||
os->last_dts = AV_NOPTS_VALUE;
|
||||
@ -1132,7 +1153,8 @@ static void find_index_range(AVFormatContext *s, const char *full_path,
|
||||
}
|
||||
|
||||
static int update_stream_extradata(AVFormatContext *s, OutputStream *os,
|
||||
AVCodecParameters *par)
|
||||
AVCodecParameters *par,
|
||||
AVRational *frame_rate)
|
||||
{
|
||||
uint8_t *extradata;
|
||||
|
||||
@ -1149,7 +1171,7 @@ static int update_stream_extradata(AVFormatContext *s, OutputStream *os,
|
||||
os->ctx->streams[0]->codecpar->extradata = extradata;
|
||||
os->ctx->streams[0]->codecpar->extradata_size = par->extradata_size;
|
||||
|
||||
set_codec_str(s, par, os->codec_str, sizeof(os->codec_str));
|
||||
set_codec_str(s, par, frame_rate, os->codec_str, sizeof(os->codec_str));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1298,7 +1320,7 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
int64_t seg_end_duration, elapsed_duration;
|
||||
int ret;
|
||||
|
||||
ret = update_stream_extradata(s, os, st->codecpar);
|
||||
ret = update_stream_extradata(s, os, st->codecpar, &st->avg_frame_rate);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user