File bsc1202032.patch of Package libreoffice.26317

From fd8dc87cc895a6e478596873764bdbdfb8fd2d7a Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.com>
Date: Fri, 2 Sep 2022 14:19:41 +0200
Subject: [PATCH] Related: tdf#149969 PPTX export: add loop from the animation
 of a media shape

The PPTX import maps media nodes to XAudio nodes, but the export side in
PPTXAnimationExport::WriteAnimationNodeAudio() only handled audio, not
video.

This is fine, that code was added for audio narration purposes, but the
same animation handles looping for videos, so this needs extending.

Fix the problem by exporting <p:audio> conditionally and write video
markup (especially info about repeat count) when the content of the
media shape is video, not audio.

(cherry picked from commit 38671e21d7dbcd5019912b9468305018de0c922e)

Change-Id: Iba6bb4901b984c4363023f05232efc06ff069022
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139399
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
---
 sd/source/filter/eppt/pptx-animations.cxx |  47 ++++++++++++++++++----
 3 files changed, 65 insertions(+), 8 deletions(-)
 create mode 100644 sd/qa/filter/eppt/data/video-loop.pptx

diff --git a/sd/source/filter/eppt/pptx-animations.cxx b/sd/source/filter/eppt/pptx-animations.cxx
index 43ef7ce4d55d..f0f46968bcd8 100644
--- a/sd/source/filter/eppt/pptx-animations.cxx
+++ b/sd/source/filter/eppt/pptx-animations.cxx
@@ -659,6 +659,9 @@ bool IsAudioURL(const OUString& rURL)
 {
     return rURL.endsWithIgnoreAsciiCase(".wav") || rURL.endsWithIgnoreAsciiCase(".m4a");
 }
+
+/// Returns if rURL has an extension which is a video format.
+bool IsVideoURL(const OUString& rURL) { return rURL.endsWithIgnoreAsciiCase(".mp4"); }
 }

 namespace oox::core
@@ -1235,6 +1238,7 @@ void PPTXAnimationExport::WriteAnimationNodeAudio()
         bValid = true;
     }

+    bool bVideo = false;
     if (!bValid)
     {
         if (xAudio->getSource() >>= xShape)
@@ -1243,7 +1247,8 @@ void PPTXAnimationExport::WriteAnimationNodeAudio()
             bool bHasMediaURL = xShapeProps->getPropertySetInfo()->hasPropertyByName("MediaURL");
             if (bHasMediaURL && (xShapeProps->getPropertyValue("MediaURL") >>= sUrl))
             {
-                bValid = IsAudioURL(sUrl);
+                bVideo = IsVideoURL(sUrl);
+                bValid = IsAudioURL(sUrl) || bVideo;
             }
         }
     }
@@ -1256,12 +1261,31 @@ void PPTXAnimationExport::WriteAnimationNodeAudio()
         mrPowerPointExport.embedEffectAudio(mpFS, sUrl, sRelId, sName);
     }

-    bool bNarration = xAudio->getNarration();
-    mpFS->startElementNS(XML_p, XML_audio, XML_isNarration, bNarration ? "1" : "0");
-    bool bHideDuringShow = xAudio->getHideDuringShow();
-    mpFS->startElementNS(XML_p, XML_cMediaNode, XML_showWhenStopped, bHideDuringShow ? "0" : "1");
+    if (bVideo)
+    {
+        mpFS->startElementNS(XML_p, XML_video);
+        mpFS->startElementNS(XML_p, XML_cMediaNode);
+    }
+    else
+    {
+        bool bNarration = xAudio->getNarration();
+        mpFS->startElementNS(XML_p, XML_audio, XML_isNarration, bNarration ? "1" : "0");
+        bool bHideDuringShow = xAudio->getHideDuringShow();
+        mpFS->startElementNS(XML_p, XML_cMediaNode, XML_showWhenStopped,
+                             bHideDuringShow ? "0" : "1");
+    }

-    mpFS->startElementNS(XML_p, XML_cTn);
+    animations::Timing eTiming{};
+    bool bLooping
+        = (xAudio->getRepeatCount() >>= eTiming) && eTiming == animations::Timing_INDEFINITE;
+    if (bVideo && bLooping)
+    {
+        mpFS->startElementNS(XML_p, XML_cTn, XML_repeatCount, "indefinite");
+    }
+    else
+    {
+        mpFS->startElementNS(XML_p, XML_cTn);
+    }
     WriteAnimationCondList(mpContext->getCondition(true), XML_stCondLst);
     WriteAnimationCondList(mpContext->getCondition(false), XML_endCondLst);
     mpFS->endElementNS(XML_p, XML_cTn);
@@ -1281,7 +1305,14 @@ void PPTXAnimationExport::WriteAnimationNodeAudio()
     mpFS->endElementNS(XML_p, XML_tgtEl);

     mpFS->endElementNS(XML_p, XML_cMediaNode);
-    mpFS->endElementNS(XML_p, XML_audio);
+    if (bVideo)
+    {
+        mpFS->endElementNS(XML_p, XML_video);
+    }
+    else
+    {
+        mpFS->endElementNS(XML_p, XML_audio);
+    }
 }

 void PPTXAnimationExport::WriteAnimationNode(const NodeContextPtr& pContext)
@@ -1456,7 +1487,7 @@ void NodeContext::initValid(bool bHasValidChild, bool bIsIterateChild)
                     = xShapeProps->getPropertySetInfo()->hasPropertyByName("MediaURL");
                 if (bHasMediaURL && (xShapeProps->getPropertyValue("MediaURL") >>= sURL))
                 {
-                    mbValid = IsAudioURL(sURL);
+                    mbValid = IsAudioURL(sURL) || IsVideoURL(sURL);
                 }
             }
         }
--
2.35.3

openSUSE Build Service is sponsored by