From patchwork Sat Jun 20 00:10:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yongle Lin X-Patchwork-Id: 20509 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id BFC4344B52B for ; Sat, 20 Jun 2020 03:11:24 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9652468B677; Sat, 20 Jun 2020 03:11:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E04E868B1B2 for ; Sat, 20 Jun 2020 03:11:17 +0300 (EEST) Received: by mail-pj1-f41.google.com with SMTP id u8so4777445pje.4 for ; Fri, 19 Jun 2020 17:11:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=syrKN72bTyAZo9A2jdUs0J3MpCLTZBWqX9GouRpP3J8=; b=ITsEJxe/m7H94Aw51BzYIf3+k1EoFx5eoKIu3+Y9/YjPtqqm0rmSJyJXITXIQTbKHN bTYYbdpdVO/6ygf1tstmpVpWOn/cDZXxqiG0Hb2i0EQvbn7qucWRymbWDQvOEUimC0m4 Q7RmmiwbNjVEgzQj9NQ6XvB1KEtFKHG27rJ/FlBQ1uJhCE3nuMmZm/bngU5H9Pr3SsJF ywIaJbo1TMMIW7umtgUSjXNMUnmMGso/0aFwdnEcOrIjT3BOZfBLI0HC6flfCqk1Y/6z 395MU9RbXSyTwLz3/0ebT6vchFBghc9rtdTrz/aMsVa+n47wXIwzi+wCeYxqOIGadRIG tGoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=syrKN72bTyAZo9A2jdUs0J3MpCLTZBWqX9GouRpP3J8=; b=pfh8mtS2KD0be5z3HWwSDSyzY2rVfnzu+MkZG7jLng8uDuk3fAytpaoc2oDfxvrquh p3G1DwsfW0dkufx/GK1opjM/pOxmcuwh+lECrEVyYamy+TWMi95TUHeGilMMAd+AAxDq Xj9hv6ECrlnuIkp0ueivJvQfLP2xALukuRGMRyaaTJ6n6B38U6hpw6a+JTubZGTshpWj WMOJ7+hZ4RW46dxSNOTessE+PjALzzGyVTwXM+4hgvC/GKaHr9WiLQa/YnQwpnQTrCZ3 hZ344Oue23tOlxPQVy2f/BztpokUxx//JbsiivkRIVCyBC/vImUrGyjOVo2lxjvXZdKK w6KQ== X-Gm-Message-State: AOAM531Tag5SSHd/2kGH/HttSgtaIoray+aqLZPKggMPKtxFKplhK9qA +1CVy3SqBMO/iCzASg9y5g9Du2O/ X-Google-Smtp-Source: ABdhPJzANFoZ/UuO7FCTzmtxKm3KMMbVlo3fDwIr3TKMKdSy/BW+lpdUatUcO8KDI1pNLkgExLHsQg== X-Received: by 2002:a17:90a:336b:: with SMTP id m98mr5934241pjb.38.1592611875890; Fri, 19 Jun 2020 17:11:15 -0700 (PDT) Received: from yonglel.c.googlers.com.com (219.29.83.34.bc.googleusercontent.com. [34.83.29.219]) by smtp.gmail.com with ESMTPSA id p186sm6877198pfg.107.2020.06.19.17.11.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jun 2020 17:11:15 -0700 (PDT) From: Yongle Lin X-Google-Original-From: Yongle Lin To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Jun 2020 00:10:06 +0000 Message-Id: <20200620001006.159305-1-yonglel@google.com> X-Mailer: git-send-email 2.27.0.111.gc72c7da667-goog In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/isom: allow ISO 639 codes for mov 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: Yongle Lin Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Allow ISO 639 language codes for text tracks in mov format when strictness is set to experimental --- libavformat/isom.c | 9 +++++++-- libavformat/isom.h | 2 +- libavformat/movenc.c | 6 +++--- tests/fate/mov.mak | 3 +++ tests/ref/fate/mov-iso639-lang | 4 ++++ 5 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 tests/ref/fate/mov-iso639-lang diff --git a/libavformat/isom.c b/libavformat/isom.c index 44c7b13038..de20ea8d8b 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -416,7 +416,7 @@ static const char mov_mdhd_language_map[][4] = { "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav" }; -int ff_mov_iso639_to_lang(const char lang[4], int mp4) +int ff_mov_iso639_to_lang(const char lang[4], int mp4, int strict_std_compliance) { int i, code = 0; @@ -426,8 +426,13 @@ int ff_mov_iso639_to_lang(const char lang[4], int mp4) return i; } /* XXX:can we do that in mov too? */ - if (!mp4) + if (!mp4 && (strict_std_compliance != FF_COMPLIANCE_EXPERIMENTAL || !strcmp(lang, "und"))) { + if (strcmp(lang, "und")) + av_log(NULL, AV_LOG_WARNING, "Non macintosh language is discarded for mov\n"); return -1; + } + if (!mp4) + av_log(NULL, AV_LOG_WARNING, "Experimental behavior: enable iso 639 language in mov\n"); /* handle undefined as such */ if (lang[0] == '\0') lang = "und"; diff --git a/libavformat/isom.h b/libavformat/isom.h index 41a9c64c11..9d018ebf1f 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -43,7 +43,7 @@ extern const AVCodecTag ff_codec_movaudio_tags[]; extern const AVCodecTag ff_codec_movsubtitle_tags[]; extern const AVCodecTag ff_codec_movdata_tags[]; -int ff_mov_iso639_to_lang(const char lang[4], int mp4); +int ff_mov_iso639_to_lang(const char lang[4], int mp4, int strict_std_compliance); int ff_mov_lang_to_iso639(unsigned code, char to[4]); struct AVAESCTR; diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 520aaafb74..4d7a98245e 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3429,7 +3429,7 @@ static int mov_write_string_data_tag(AVIOContext *pb, const char *data, int lang return size; } else { if (!lang) - lang = ff_mov_iso639_to_lang("und", 1); + lang = ff_mov_iso639_to_lang("und", 1, FF_COMPLIANCE_NORMAL); avio_wb16(pb, strlen(data)); /* string length */ avio_wb16(pb, lang); avio_write(pb, data, strlen(data)); @@ -3468,7 +3468,7 @@ static AVDictionaryEntry *get_metadata_lang(AVFormatContext *s, while ((t2 = av_dict_get(s->metadata, tag2, t2, AV_DICT_IGNORE_SUFFIX))) { len2 = strlen(t2->key); if (len2 == len + 4 && !strcmp(t->value, t2->value) - && (l = ff_mov_iso639_to_lang(&t2->key[len2 - 3], 1)) >= 0) { + && (l = ff_mov_iso639_to_lang(&t2->key[len2 - 3], 1, s->strict_std_compliance)) >= 0) { *lang = l; return t; } @@ -6445,7 +6445,7 @@ static int mov_init(AVFormatContext *s) track->st = st; track->par = st->codecpar; - track->language = ff_mov_iso639_to_lang(lang?lang->value:"und", mov->mode!=MODE_MOV); + track->language = ff_mov_iso639_to_lang(lang?lang->value:"und", mov->mode!=MODE_MOV, s->strict_std_compliance); if (track->language < 0) track->language = 32767; // Unspecified Macintosh language code track->mode = mov->mode; diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak index 7a721d7c95..a85cc1a07d 100644 --- a/tests/fate/mov.mak +++ b/tests/fate/mov.mak @@ -29,6 +29,7 @@ FATE_MOV_FFPROBE = fate-mov-neg-firstpts-discard \ fate-mov-guess-delay-2 \ fate-mov-guess-delay-3 \ fate-mov-mp4-with-mov-in24-ver \ + fate-mov-iso639-lang \ FATE_MOV_FASTSTART = fate-mov-faststart-4gb-overflow \ @@ -124,3 +125,5 @@ fate-mov-faststart-4gb-overflow: CMP = oneline fate-mov-faststart-4gb-overflow: REF = bc875921f151871e787c4b4023269b29 fate-mov-mp4-with-mov-in24-ver: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream=codec_name -select_streams 1 $(TARGET_SAMPLES)/mov/mp4-with-mov-in24-ver.mp4 + +fate-mov-iso639-lang: CMD = ffmpeg$(PROGSSUF)$(EXESUF) -f lavfi -i sine=frequency=1000:duration=15 -strict experimental -metadata:s:a:0 language=deu -y $(TARGET_PATH)/metadata.mov; run ffprobe -show_entries stream=index:stream_tags=language $(TARGET_PATH)/metadata.mov; rm metadata.mov diff --git a/tests/ref/fate/mov-iso639-lang b/tests/ref/fate/mov-iso639-lang new file mode 100644 index 0000000000..6d1f61169d --- /dev/null +++ b/tests/ref/fate/mov-iso639-lang @@ -0,0 +1,4 @@ +[STREAM] +index=0 +TAG:language=deu +[/STREAM]