From patchwork Fri May 4 06:32:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jeyapal, Karthick" X-Patchwork-Id: 8774 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp271734jad; Thu, 3 May 2018 23:32:48 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoZmdKoNZ5pjCDTVaUidPfqcN1nq7NgSgTL/LtGy0oQB3EOy2o/7BZUwILEVWtnx5c7H2LL X-Received: by 10.28.94.133 with SMTP id s127mr3545466wmb.123.1525415568078; Thu, 03 May 2018 23:32:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525415568; cv=none; d=google.com; s=arc-20160816; b=eDRN1FxwlM8g3rZaSokCTYb2FekSmsuai/tdpxsHOMbzjaPl8F132B1F9ptB35wacu RiuEscsuUZVpJhZlpeAWzo8Oqx4tki23GqJHUZ5zaNmJWNiE2LUcmc3BwCZl+91uM/2y zRZP+z43k8ESroDysjIc2Zu+3AZO/1NQa8IPXweY+ONhJbn0o9hcu6Cc3w+Vo6UgX7oR OS8p9vXtdni1MH89ushOWM0WEOLEmjiebeO8yx2/7KCL7uitVzy7bIhTT9DuegftOe7o LSnMx2J7te0/jpknAVYXNir2bL3sL2EmA7UNTyNwJfv7OJMc95iUHSdnkdCztMYVqSab VYPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:message-id:date:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=fwtwUBNyym0F58PHHBIYU2/4QBdl5aqCEhT1fgOdRc0=; b=XrIDWe8aE67SIoZe9Zja5BVcxXZpAspfDnASU30xFB20Wyd3/lESVf6qopAzg7r+dd nmIwcl/zMgangosLDteKHEToOb1bA/kHpibY5+jTTU3bvysB5AoVr7CBlU+3Q+bL/E4Z ZDXD0aVEGmcRAiMVFphhqZWGZlyvegUwELI7p3/34oYYXVL6u8Kkj+UOTbgEvTM2ENEM NNHixW8fSuALY1+oqbiLtBsBEevSPztr6ViB7We5jeLjwhJurD0/Xjo0smbnU8Y1fO8V scbC6erTSEXFcQ+17ikERXfAaTi5CO9DVBuyQRdupeQVGDpAdZVYbOeoP2sUWpFVaU48 tIiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=X9GyVar2; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=NONE dis=NONE) header.from=akamai.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n5-v6si8153329wrm.95.2018.05.03.23.32.47; Thu, 03 May 2018 23:32:48 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=X9GyVar2; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=NONE dis=NONE) header.from=akamai.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F04F368A4F7; Fri, 4 May 2018 09:32:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from a1i318.smtp2go.com (a1i318.smtp2go.com [43.228.185.62]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3BEB768A0BC for ; Fri, 4 May 2018 09:32:05 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpservice.net; s=m78bu0.a1-4.dyn; x=1525416464; h=Feedback-ID: X-Smtpcorp-Track:Message-Id:Date:Subject:To:From:Reply-To:Sender: List-Unsubscribe; bh=gKQJh6srS6AnH8pK/Ni+TMJYGu3SXf/6EcACZN7LKDk=; b=X9GyVar2 hYWmpLa7IhdQ/YH0vXBrs6t7HsvFLpOl8hRiPWveWVHNiZbFQTl8hV16EOI7sV0xSblI1fME/pQ6e MFWrbND8xRhSikEd/QZtSlVMnW811rL86yp9yT5a4ii3a60FB02qsjGe+nKaX87tRGUUw7gOZBy+z GorSIoJ8AuNoEHJL9hSjyF37cwm0CLzbNUGtxAybVLv2JzXekBIg56npO5j+MkSPUxo7+pbUPvkB2 ZguSCfZWbYqdjXZkab2LkOmrjFtpXjZMvYEPSvq2Nx6AC+opCOwoL4GtYJhTF4zQkbZAQZFZbn0V3 6Y7H++r1JAXE1LdEluVsTzjBrw==; From: Karthick J To: ffmpeg-devel@ffmpeg.org Date: Fri, 4 May 2018 12:02:20 +0530 Message-Id: <1525415541-11801-1-git-send-email-kjeyapal@akamai.com> X-Mailer: git-send-email 1.9.1 X-Smtpcorp-Track: 1fElGgDIIcbv1e.676Dgh4NP Feedback-ID: 337386m:337386asVRLGB:337386sdhSe9y640:SMTPCORP X-Report-Abuse: Please forward a copy of this message, including all headers, to Subject: [FFmpeg-devel] [PATCH 1/2] avformat/dashenc: Added option for Segment file format X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Karthick Jeyapal MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Karthick Jeyapal Right now segment file format is chosen to be either mp4 or webm based on the codec format. This patch makes that choice configurable by the user, instead of being decided by the muxer. --- doc/muxers.texi | 8 ++++++++ libavformat/dashenc.c | 48 ++++++++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 6f03bba..2429f8e 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -282,6 +282,14 @@ corrects that index value. Typically this logic is needed in live streaming use cases. The network bandwidth fluctuations are common during long run streaming. Each fluctuation can cause the segment indexes fall behind the expected real time position. + +@item dash_segment_type @var{dash_segment_type} +Possible values: +@item mp4 +If this flag is set, the dash segment files will be in in ISOBMFF format. This is the default format. + +@item webm +If this flag is set, the dash segment files will be in in WebM format. @end table @anchor{framecrc} diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 1dd6333..412f074 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -48,6 +48,11 @@ #include "vpcc.h" #include "dash.h" +typedef enum { + SEGMENT_TYPE_MP4, + SEGMENT_TYPE_WEBM, +} SegmentType; + typedef struct Segment { char file[1024]; int64_t start_pos; @@ -69,7 +74,6 @@ typedef struct OutputStream { AVFormatContext *ctx; int ctx_inited, as_idx; AVIOContext *out; - char format_name[8]; int packets_written; char initfile[1024]; int64_t init_start_pos, pos; @@ -125,6 +129,8 @@ typedef struct DASHContext { int streaming; int64_t timeout; int index_correction; + SegmentType segment_type; + char format_name[8]; } DASHContext; static struct codec_string { @@ -581,13 +587,13 @@ static int write_adaptation_set(AVFormatContext *s, AVIOContext *out, int as_ind if (as->media_type == AVMEDIA_TYPE_VIDEO) { AVStream *st = s->streams[i]; avio_printf(out, "\t\t\tformat_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->width, s->streams[i]->codecpar->height); + i, c->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->width, s->streams[i]->codecpar->height); if (st->avg_frame_rate.num) avio_printf(out, " frameRate=\"%d/%d\"", st->avg_frame_rate.num, st->avg_frame_rate.den); avio_printf(out, ">\n"); } else { avio_printf(out, "\t\t\t\n", - i, os->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->sample_rate); + i, c->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->sample_rate); avio_printf(out, "\t\t\t\t\n", s->streams[i]->codecpar->channels); } @@ -959,27 +965,14 @@ static int dash_init(AVFormatContext *s) if (!ctx) return AVERROR(ENOMEM); - // choose muxer based on codec: webm for VP8 and opus, mp4 otherwise - // note: os->format_name is also used as part of the mimetype of the - // representation, e.g. video/ - if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_VP8 || - s->streams[i]->codecpar->codec_id == AV_CODEC_ID_OPUS || - s->streams[i]->codecpar->codec_id == AV_CODEC_ID_VORBIS) { - snprintf(os->format_name, sizeof(os->format_name), "webm"); - - if (s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) { - av_log(s, AV_LOG_ERROR, - "WebM support in dashenc is experimental and has not " - "been validated. For testing purposes, make sure " - "to add -strict experimental and override " - "-init_seg_name and -media_seg_name to end with " - "the extension 'webm'.\n"); - return AVERROR(EINVAL); - } + if (c->segment_type == SEGMENT_TYPE_WEBM) { + snprintf(c->format_name, sizeof(c->format_name), "webm"); + } else if (c->segment_type == SEGMENT_TYPE_MP4) { + snprintf(c->format_name, sizeof(c->format_name), "mp4"); } else { - snprintf(os->format_name, sizeof(os->format_name), "mp4"); + return AVERROR_MUXER_NOT_FOUND; } - ctx->oformat = av_guess_format(os->format_name, NULL, NULL); + ctx->oformat = av_guess_format(c->format_name, NULL, NULL); if (!ctx->oformat) return AVERROR_MUXER_NOT_FOUND; os->ctx = ctx; @@ -1017,7 +1010,7 @@ static int dash_init(AVFormatContext *s) av_dict_free(&opts); os->init_start_pos = 0; - if (!strcmp(os->format_name, "mp4")) { + if (c->segment_type == SEGMENT_TYPE_MP4) { if (c->streaming) av_dict_set(&opts, "movflags", "frag_every_frame+dash+delay_moov", 0); else @@ -1082,7 +1075,7 @@ static int dash_write_header(AVFormatContext *s) // Flush init segment // Only for WebM segment, since for mp4 delay_moov is set and // the init segment is thus flushed after the first packets. - if (strcmp(os->format_name, "mp4") && + if (c->segment_type == SEGMENT_TYPE_WEBM && (ret = flush_init_segment(s, os)) < 0) return ret; } @@ -1253,7 +1246,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream) } if (!c->single_file) { - if (!strcmp(os->format_name, "mp4") && !os->written_len) + if (c->segment_type == SEGMENT_TYPE_MP4 && !os->written_len) write_styp(os->ctx->pb); } else { snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile); @@ -1443,7 +1436,7 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) } //write out the data immediately in streaming mode - if (c->streaming && !strcmp(os->format_name, "mp4")) { + if (c->streaming && c->segment_type == SEGMENT_TYPE_MP4) { int len = 0; uint8_t *buf = NULL; if (!os->written_len) @@ -1538,6 +1531,9 @@ static const AVOption options[] = { { "streaming", "Enable/Disable streaming mode of output. Each frame will be moof fragment", OFFSET(streaming), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E }, { "timeout", "set timeout for socket I/O operations", OFFSET(timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags = E }, { "index_correction", "Enable/Disable segment index correction logic", OFFSET(index_correction), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E }, + { "dash_segment_type", "set dash segment files type", OFFSET(segment_type), AV_OPT_TYPE_INT, {.i64 = SEGMENT_TYPE_MP4 }, 0, SEGMENT_TYPE_WEBM, E, "segment_type"}, + { "mp4", "make segment file in ISOBMFF format", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_MP4 }, 0, UINT_MAX, E, "segment_type"}, + { "webm", "make segment file in WebM format", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_WEBM }, 0, UINT_MAX, E, "segment_type"}, { NULL }, };