#include "config.h"
#include "config_components.h"
+#include <time.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "libavutil/time.h"
#include "libavutil/time_internal.h"
+#include "libavcodec/avcodec.h"
+
#include "av1.h"
#include "avc.h"
#include "avformat.h"
int master_playlist_created;
AVIOContext *mpd_out;
AVIOContext *m3u8_out;
+ AVIOContext *http_delete;
int streaming;
int64_t timeout;
int index_correction;
int64_t update_period;
} DASHContext;
-static struct codec_string {
- int id;
- const char *str;
+static const struct codec_string {
+ enum AVCodecID id;
+ const char str[8];
} codecs[] = {
{ AV_CODEC_ID_VP8, "vp8" },
{ AV_CODEC_ID_VP9, "vp9" },
{ AV_CODEC_ID_VORBIS, "vorbis" },
{ AV_CODEC_ID_OPUS, "opus" },
{ AV_CODEC_ID_FLAC, "flac" },
- { 0, NULL }
-};
-
-static struct format_string {
- SegmentType segment_type;
- const char *str;
-} formats[] = {
- { SEGMENT_TYPE_AUTO, "auto" },
- { SEGMENT_TYPE_MP4, "mp4" },
- { SEGMENT_TYPE_WEBM, "webm" },
- { 0, NULL }
+ { AV_CODEC_ID_NONE }
};
static int dashenc_io_open(AVFormatContext *s, AVIOContext **pb, char *filename,
}
}
-static const char *get_format_str(SegmentType segment_type) {
- int i;
- for (i = 0; i < SEGMENT_TYPE_NB; i++)
- if (formats[i].segment_type == segment_type)
- return formats[i].str;
+static const char *get_format_str(SegmentType segment_type)
+{
+ switch (segment_type) {
+ case SEGMENT_TYPE_MP4: return "mp4";
+ case SEGMENT_TYPE_WEBM: return "webm";
+ }
return NULL;
}
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);
+ int ret = ff_isom_get_vpcc_features(s, par, NULL, 0, frame_rate, &vpcc);
if (ret == 0) {
av_strlcatf(str, size, "vp09.%02d.%02d.%02d",
vpcc.profile, vpcc.level, vpcc.bitdepth);
int i;
// common Webm codecs are not part of RFC 6381
- for (i = 0; codecs[i].id; i++)
+ for (i = 0; codecs[i].id != AV_CODEC_ID_NONE; i++)
if (codecs[i].id == par->codec_id) {
if (codecs[i].id == AV_CODEC_ID_VP9) {
set_vp9_codec_str(s, par, frame_rate, str, size);
ff_format_io_close(s, &c->mpd_out);
ff_format_io_close(s, &c->m3u8_out);
+ ff_format_io_close(s, &c->http_delete);
}
static void output_segment_list(OutputStream *os, AVIOContext *out, AVFormatContext *s,
if (os->segment_type != SEGMENT_TYPE_MP4)
continue;
get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL, i);
- ff_hls_write_audio_rendition(c->m3u8_out, (char *)audio_group,
+ ff_hls_write_audio_rendition(c->m3u8_out, audio_group,
playlist_file, NULL, i, is_default);
max_audio_bitrate = FFMAX(st->codecpar->bit_rate +
os->muxer_overhead, max_audio_bitrate);
char codec_str[128];
AVStream *st = s->streams[i];
OutputStream *os = &c->streams[i];
- char *agroup = NULL;
+ const char *agroup = NULL;
int stream_bitrate = os->muxer_overhead;
if (os->bit_rate > 0)
stream_bitrate += os->bit_rate;
continue;
av_strlcpy(codec_str, os->codec_str, sizeof(codec_str));
if (max_audio_bitrate) {
- agroup = (char *)audio_group;
+ agroup = audio_group;
stream_bitrate += max_audio_bitrate;
av_strlcat(codec_str, ",", sizeof(codec_str));
av_strlcat(codec_str, audio_codec_str, sizeof(codec_str));
return AVERROR_MUXER_NOT_FOUND;
ctx->interrupt_callback = s->interrupt_callback;
ctx->opaque = s->opaque;
+#if FF_API_AVFORMAT_IO_CLOSE
+FF_DISABLE_DEPRECATION_WARNINGS
ctx->io_close = s->io_close;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
ctx->io_close2 = s->io_close2;
ctx->io_open = s->io_open;
ctx->strict_std_compliance = s->strict_std_compliance;
int http_base_proto = ff_is_http_proto(filename);
if (http_base_proto) {
- AVIOContext *out = NULL;
AVDictionary *http_opts = NULL;
set_http_options(&http_opts, c);
av_dict_set(&http_opts, "method", "DELETE", 0);
- if (dashenc_io_open(s, &out, filename, &http_opts) < 0) {
+ if (dashenc_io_open(s, &c->http_delete, filename, &http_opts) < 0) {
av_log(s, AV_LOG_ERROR, "failed to delete %s\n", filename);
}
-
av_dict_free(&http_opts);
- ff_format_io_close(s, &out);
+
+ //Nothing to write
+ dashenc_io_close(s, &c->http_delete, filename);
} else {
int res = ffurl_delete(filename);
if (res < 0) {
DASHContext *c = s->priv_data;
OutputStream *os = &c->streams[st->index];
AVFormatContext *oc = os->ctx;
- if (oc->oformat->check_bitstream) {
+ if (ffofmt(oc->oformat)->check_bitstream) {
AVStream *const ost = oc->streams[0];
int ret;
- ret = oc->oformat->check_bitstream(oc, ost, avpkt);
+ ret = ffofmt(oc->oformat)->check_bitstream(oc, ost, avpkt);
if (ret == 1) {
FFStream *const sti = ffstream(st);
FFStream *const osti = ffstream(ost);
.version = LIBAVUTIL_VERSION_INT,
};
-const AVOutputFormat ff_dash_muxer = {
- .name = "dash",
- .long_name = NULL_IF_CONFIG_SMALL("DASH Muxer"),
- .extensions = "mpd",
+const FFOutputFormat ff_dash_muxer = {
+ .p.name = "dash",
+ .p.long_name = NULL_IF_CONFIG_SMALL("DASH Muxer"),
+ .p.extensions = "mpd",
+ .p.audio_codec = AV_CODEC_ID_AAC,
+ .p.video_codec = AV_CODEC_ID_H264,
+ .p.flags = AVFMT_GLOBALHEADER | AVFMT_NOFILE | AVFMT_TS_NEGATIVE,
+ .p.priv_class = &dash_class,
.priv_data_size = sizeof(DASHContext),
- .audio_codec = AV_CODEC_ID_AAC,
- .video_codec = AV_CODEC_ID_H264,
- .flags = AVFMT_GLOBALHEADER | AVFMT_NOFILE | AVFMT_TS_NEGATIVE,
.init = dash_init,
.write_header = dash_write_header,
.write_packet = dash_write_packet,
.write_trailer = dash_write_trailer,
.deinit = dash_free,
.check_bitstream = dash_check_bitstream,
- .priv_class = &dash_class,
};