Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libavformat/mov: Expose Quicktime poster_time value as metadata TAG. #21

Closed

Conversation

brycechesternewman
Copy link

@brycechesternewman brycechesternewman commented Feb 2, 2022

I need the ability to derive the poster time found in the mvhd, so I can
use that value to create a thumbnail from ffmpeg. More details can be
found here
https://www.mail-archive.com/ffmpeg-user@ffmpeg.org/msg30003.html

Signed-off-by: Bryce Chester Newman bryce.newman@gettyimages.com
cc: Bryce Newman bryce.newman@gettyimages.com

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Feb 2, 2022

Welcome to FFmpeg

Hi @brycechesternewman,

This is the FFmpeg Pull Request Agent for GitHub, which enables sending of patch series to the FFmpeg mailing list from GitHub Pull Requests. It is an adaption of GitGitGadget and credits belong to its creators.

You are here to submit a contribution to FFmpeg? That's great!
We try to make that process as easy and straightworward as possible, but there are still a number of things to consider.

Prerequisites

First of all, make sure that you have read the through the Devloper Documentation

Please make sure that your Pull Request has a good description, as it will be used as cover letter.

Also, it is a good idea to review the commit messages one last time, as the FFmpeg project expects them in a quite specific form:

  • the lines should not exceed 76 columns,
  • the first line should be like a header and typically start with a prefix like "tests:" or "revisions:" to state which subsystem the change is about, and
  • the commit messages' body should be describing the "why?" of the change.
  • Finally, the commit messages should end in a Signed-off-by: line matching the commits' author.

It is in general a good idea to await the automated test ("Checks") in this Pull Request before contributing the patches, e.g. to avoid trivial issues such as unportable code.

Submitting your Patchset

Before you can submit the patches, your GitHub username needs to be added to the list of permitted users. Any already-permitted user can do that, by adding a comment to your PR of the form /allow. A good way to find other contributors is to locate recent pull requests where someone has been /allowed:

Both the person who commented /allow and the PR author are able to /allow you.

An alternative is the channel #ffmpeg-devel on the Libera Chat IRC network:

<newcontributor> I've just created my first PR, could someone please /allow me? https://github.com/ffstaging/ffmpeg/pull/12345
<veteran> newcontributor: it is done
<newcontributor> thanks!

Once on the list of permitted usernames, you can contribute the patches to the Git mailing list by adding a PR comment /submit.

If you want to see what email(s) would be sent for a /submit request, add a PR comment /preview to have the email(s) sent to you. You must have a public GitHub email address for this.

After you submit, the PR Agent will respond with another comment that contains the link to the cover letter mail in the FFmpeg mailing list archive. Please make sure to monitor the discussion in that thread and to address comments and suggestions (while the comments and suggestions will be mirrored into the PR by GitGitGadget, you will still want to reply via mail).

Submitting Revised Patch Versions

To iterate on your change, i.e. send a revised patch or patch series, you will first want to (force-)push to the same branch. You probably also want to modify your Pull Request description (or title). It is a good idea to summarize the revision by adding something like this to the cover letter (read: by editing the first comment on the PR, i.e. the PR description):

Changes since v1:
- Fixed a typo in the commit message (found by ...)
- Added a code comment to ... as suggested by ...
...

To send a new iteration, just add another PR comment with the contents: /submit.

Further Reference

@softworkz
Copy link
Collaborator

/allow

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Feb 2, 2022

User brycechesternewman is now allowed to use the FFmpeg Code Bot.

WARNING: brycechesternewman has no public email address set on GitHub

@brycechesternewman
Copy link
Author

/submit

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Feb 2, 2022

Submitted as pull.21.ffstaging.FFmpeg.1643844144096.ffmpegagent@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-21/brycechesternewman/patch-poster-time-tag-v1

To fetch this version to local tag pr-ffstaging-21/brycechesternewman/patch-poster-time-tag-v1:

git fetch --no-tags https://github.com/ffstaging/FFmpeg tag pr-ffstaging-21/brycechesternewman/patch-poster-time-tag-v1

@ffmpeg-codebot
Copy link

On the FFmpeg mailing list, Bryce Newman wrote (reply to this):

--===============1408693865363875483==
Content-Type: multipart/related;
	boundary="MCBoundary=_12207121320313181"

--MCBoundary=_12207121320313181
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hello,
Can someone please have a look at this patch request?
Thank you in advance.
Bryce
   =20
   =20

Bryce Chester Newman | Principal Developer
=20
p: +12069255045 |=20



From: Bryce Chester Newman <ffmpegagent@gmail.com>
Date: Wednesday, February 2, 2022 at 4:22 PM
To: ffmpeg-devel@ffmpeg.org <ffmpeg-devel@ffmpeg.org>
Cc: Bryce Newman <bryce.newman@gettyimages.com>, Bryce Newman <bryce.newman=
@gettyimages.com>
Subject: [EXTERNAL] [PATCH] [PATCH] libavformat/mov: Expose Quicktime poste=
r_time value as metadata TAG.
From: Bryce Chester Newman <bryce.newman@gettyimages.com>

I need the ability to derive the poster time found in the mvhd, so I can
use that value to create a thumbnail from ffmpeg. More details can be
found here
https://www.mail-archive.com/ffmpeg-user@ffmpeg.org/msg30003.html

Signed-off-by: Bryce Chester Newman <bryce.newman@gettyimages.com>
---
    libavformat/mov: Expose Quicktime poster_time value as metadata TAG.

    I need the ability to derive the poster time found in the mvhd, so I ca=
n
    use that value to create a thumbnail from ffmpeg. More details can be
    found here
    https://www.mail-archive.com/ffmpeg-user@ffmpeg.org/msg30003.html

    Signed-off-by: Bryce Chester Newman bryce.newman@gettyimages.com

Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging=
-21%2Fbrycechesternewman%2Fpatch-poster-time-tag-v1
Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-21=
/brycechesternewman/patch-poster-time-tag-v1
Pull-Request: https://github.com/ffstaging/FFmpeg/pull/21

 libavformat/mov.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index a80fcc1606..3d36f6563f 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1487,6 +1487,7 @@ static int mov_read_mvhd(MOVContext *c, AVIOContext *=
pb, MOVAtom atom)
 {
     int i;
     int64_t creation_time;
+    int32_t poster_time;
     int version =3D avio_r8(pb); /* version */
     avio_rb24(pb); /* flags */

@@ -1525,12 +1526,21 @@ static int mov_read_mvhd(MOVContext *c, AVIOContext=
 *pb, MOVAtom atom)

     avio_rb32(pb); /* preview time */
     avio_rb32(pb); /* preview duration */
-    avio_rb32(pb); /* poster time */
+    poster_time =3D avio_rb32(pb); /* poster time */
     avio_rb32(pb); /* selection time */
     avio_rb32(pb); /* selection duration */
     avio_rb32(pb); /* current time */
     avio_rb32(pb); /* next track ID */

+    av_log(c->fc, AV_LOG_TRACE, "poster_time =3D %i, time_scale =3D %i\n",=
 poster_time, c->time_scale);
+    if(poster_time && c->time_scale && c->time_scale > 0) {
+        char buffer[32];
+        float poster_time_location =3D (float)poster_time / c->time_scale;
+        snprintf(buffer, sizeof(buffer), "%.2f", poster_time_location);
+        /* This will appear as a TAG in the format section of FFProbe outp=
ut using -show_format */
+        av_dict_set(&c->fc->metadata, "poster_time", buffer, 0);
+    }
+
     return 0;
 }


base-commit: 2e82c610553efd69b4d9b6c359423a19c2868255
--
ffmpeg-codebot

--MCBoundary=_12207121320313181
Content-Type: image/png; name="0.png"
Content-Disposition: inline; filename="0.png"
Content-Id: <122071213203101614@us-mta-414.us.mimecast.lan>
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF
GmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0w
TXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRh
LyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDMgNzkuMTY0NTI3LCAyMDIwLzEwLzE1
LTE3OjQ4OjMyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3Jn
LzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i
IiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRw
Oi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMu
YWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNv
bS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9z
VHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIu
MSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMTItMjlUMTM6MDA6MjItMDU6MDAi
IHhtcDpNb2RpZnlEYXRlPSIyMDIwLTEyLTI5VDEzOjM3OjU5LTA1OjAwIiB4bXA6TWV0YWRhdGFE
YXRlPSIyMDIwLTEyLTI5VDEzOjM3OjU5LTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhv
dG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYt
Mi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE1N2Y3YTA1LTU5NzctNDA3Ni1hYTRiLWRk
YjQwYjhhYzljNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxNTdmN2EwNS01OTc3LTQwNzYt
YWE0Yi1kZGI0MGI4YWM5YzYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxNTdm
N2EwNS01OTc3LTQwNzYtYWE0Yi1kZGI0MGI4YWM5YzYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpT
ZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAu
aWlkOjE1N2Y3YTA1LTU5NzctNDA3Ni1hYTRiLWRkYjQwYjhhYzljNiIgc3RFdnQ6d2hlbj0iMjAy
MC0xMi0yOVQxMzowMDoyMi0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9z
aG9wIDIyLjEgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRm
OkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+
mPZ18gAABQZJREFUSMe9VWtIVlkU3dT4x5mcGSV/JAOZQeKLRDEtH4lllIhKZj56jDqhpKmgfuOo
+SAcUnMMStJJxVd5R0dUFB1LJcXXNVPLJ2T6mYhaimKiFeGZtS8VA5/Ov/pgc/nOuWevs9dea18S
QtCXDPpqAG/evKHl5WWanp6mhYUFKigosL5165YUHx9feeXKFeno0aOSg4ODEocPH5ZCQkIklUpV
npGRUSPL8h8PHz6kiooKGhgY2BpgdXWVVlZWlOjv73e+fPlyrYeHh/D29ha+vr4CAMLW1lbY2NgI
Ozs7Zd3Pz0+4ubmJyMhIUVhYGNbQ0EDPnj3bGmB9fV15dnZ2RllZWQkDAwPh7u4uXFxcxg8ePNhl
bW0tBwUFyTExMbKnp6dsZmbWc+DAgV6Ar2Ff7NmzR0RERFTPzc1t3wNQY2tpaSn279/PN0p89eqV
VXR0NOnr61NgYCBdu3aNEhMTKS0tjVANXbp0iUZHR3Xm5+edsTe5Y8cOUVZWJm0JAGoCsrKyhnbt
2iV6enpSkZzALd24cYNwSHknPDyc9u3bR93d3aRWq7nqH5KSknLj4uLyAGIdEBCwwBRiz1wD4Pbt
260nT54UKP8d/hvw2uTkpALCAnj58uVFLy+vJGNj4+SioiLV4uKi3tra2m57e3tkIXHnzp0f7927
95u5ubk4f/68nwZAbGxsORKIY8eOyQkJCdTe3q6sgwKtqKioFvAtoB5x6tQpYWhoKA4dOrSIPV9U
cxZ0pnODQeMvLISL+GkA+Pj4SHz4xIkTXThMg4ODvK6Vnp7ewdxeuHBBDZ7Pgg7X69ev/8Ugzs7O
AtQYMF2VlZXcn3hTU1NRW1tbrwEA7iRWD8qTi4uLaWNjg28fzGpCoyfQI11uLoCI+zMyMvKnrq6u
QOWNrJyxsTGSJEkFdTFd/2gAODk5SVwelCGnpKSQv78/oZrfWVV1dXWeL168IDSUUlNTGZgv8A18
sOrq6io+fPiwlw3KvWGAvLy8um0BoBQZxiHomkBDCnoi2traLB8/fkwonYaGhoj5fvLkCcEX0/CJ
eP36tcPz58//H8DR0VFiiaE/8t27d6m1tZWys7MTmIa+vr6/+Z3q6mp6+vQpQS3U0tJiiF69A6Ur
2Pt+dnaWQO0nAE2KYH+eMQLjQcYhggx5fS/L0MLCQuBwRlNTk9bS0hInsoDi+hkc1eVsbm5Sb28v
V/CriYmJwEzSbDJuLvFcwcxpCw4OJvCurIP7eL4VJzt37twSBp+aQfX09ASaPoh3dKampghSJogh
6siRI/zezxoAycnJDcePH+fN+bdv3+qwyTg+zid3JOhjWXICGHIZt8zBnvb79++VfnR1dVFOTk4a
ZhYPRA8NgObm5mwoaIMNhclqz2XziCgvL6fh4WGluZiyJnjaPXr0SJtVBalSWFjY51GSmZk5wXOs
o6PDXwMAtv/2wYMH6Wx7GGkMa0Y1NTV09epVxXTcXE7IMT4+rkRpaSmdOXOGGhsbqb6+PhxDkUWy
hLO6233RtEGVeufOnQLO3gRQEQAiUIXq/v37KtxUhaRKVFVVqW7evBkNqcaGhoZ2GBkZCR7bMzMz
AUybBgBTwk+o5CeAVHEj2dkcrAxu9H+DRwIPNnzhBPN++vTpGXghcNtP5icAdunExASPA2c41R8V
FOL2Lbm5uXVsoE8BrzTm5+fXY36FlJSUeKBP332U9udcX/ej/6XiX2hCXJl1ohgqAAAAAElFTkSu
QmCCDQo=
--MCBoundary=_12207121320313181
Content-Type: image/png; name="1.png"
Content-Disposition: inline; filename="1.png"
Content-Id: <122071213203101714@us-mta-414.us.mimecast.lan>
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF
6WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0w
TXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRh
LyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDMgNzkuMTY0NTI3LCAyMDIwLzEwLzE1
LTE3OjQ4OjMyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3Jn
LzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i
IiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRw
Oi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMu
YWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNv
bS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9z
VHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIu
MSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMTItMjlUMTM6MDE6MzctMDU6MDAi
IHhtcDpNb2RpZnlEYXRlPSIyMDIwLTEyLTI5VDEzOjM3OjQ0LTA1OjAwIiB4bXA6TWV0YWRhdGFE
YXRlPSIyMDIwLTEyLTI5VDEzOjM3OjQ0LTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhv
dG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYt
Mi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJhYjRjZmU5LWZkMGQtNGNiZS04YTU2LWE5
ZDhjODMwMWZlMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkNzlhM2E3MS1kYTU0LTRjNzgt
ODBhYS1kOWE3OGE2MTBkMzYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkNzlh
M2E3MS1kYTU0LTRjNzgtODBhYS1kOWE3OGE2MTBkMzYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpT
ZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAu
aWlkOmQ3OWEzYTcxLWRhNTQtNGM3OC04MGFhLWQ5YTc4YTYxMGQzNiIgc3RFdnQ6d2hlbj0iMjAy
MC0xMi0yOVQxMzowMTozNy0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9z
aG9wIDIyLjEgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2
dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJhYjRjZmU5LWZkMGQtNGNiZS04YTU2LWE5ZDhjODMwMWZl
MyIgc3RFdnQ6d2hlbj0iMjAyMC0xMi0yOVQxMzozNzo0NC0wNTowMCIgc3RFdnQ6c29mdHdhcmVB
Z2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8i
Lz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpS
REY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+x8DUkQAAAo9JREFUSMfVVj1ommEQ
vs9/TRCtVlExASkNZO0SCRKhS4lOBUEczK6LQ4e2Q8GhaxCFbl0cOhQEKTgEaqjFxaERYimCKJIq
0krEH6z6+de7l4SmJS31LRl6cHy+8vE+z93z3KmwXC7hJkMCNxyyVV4uFAq3MpnMs3K5fLdarfbM
ZrPB4/GchMPhxysDnJ+f/yhTIgG9Xq8plUqHx8fHB3RWKpXQarXg7OzMhq+sDrBYLEClUoFMJgO1
Wg2pVOpJNBo90Gq1oFAoGOhoNILBYCDlalGn02FVEFOr1bqWTqeDZAisBARBgPX19c/YphGCfeAC
IOanp6eQSCToUi1eqt3Y2IBmswnxePx9o9G4HwqFZr1ej89FyBDcbjd4vV5ApuJwOBSJudFoBBT5
FZ5nwWAQXC4Xn4tEUWQ6RCIR2NraWsRisTl9R23qdrui3++HQCBAROT4+nRlgHq9/rRYLD5Ep3xF
1jKdTmcgUQkU2T/KZrPeWq12Z2dn5zUCPV8ZoFKpOI+Oju7l83mw2WxMXBKc2oRW3UaQ7fl8TtW8
oUpWBkCLLpE1WCwWMBgMjDm1h55kW41GA5PJBHw+35x3kt+R1njpF0wVfn5AT3KXVCo9QeYfsRq7
w+F4ywtweJEUOsxPyN5CVTidzhdo4ZfoJv5dRC2Qy+WsJRjSi2TuwuFS7O7uQr/fh9lsxjcH7Xab
rQJaF8hawK8omcgosITA9/b2aEb4AJLJJC0yoN3zaxDIdDplYudyOT6A8XjMLqK8Li5BriPwVxrQ
xqT411+83wLgGv6JMCUNFgVpQxXSHHADbG5uXj0yF104Ckwmk4SGkBzFDbC/v3/1+A0zje26jc81
u91eIYEvK/pTCP/9v4rvyUotSv4BhMwAAAAASUVORK5CYIINCg==
--MCBoundary=_12207121320313181
Content-Type: image/png; name="2.png"
Content-Disposition: inline; filename="2.png"
Content-Id: <122071213203101814@us-mta-414.us.mimecast.lan>
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF
GmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0w
TXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRh
LyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDMgNzkuMTY0NTI3LCAyMDIwLzEwLzE1
LTE3OjQ4OjMyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3Jn
LzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i
IiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRw
Oi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMu
YWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNv
bS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9z
VHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIu
MSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMTItMjlUMTM6MDA6NTktMDU6MDAi
IHhtcDpNb2RpZnlEYXRlPSIyMDIwLTEyLTI5VDEzOjM3OjUxLTA1OjAwIiB4bXA6TWV0YWRhdGFE
YXRlPSIyMDIwLTEyLTI5VDEzOjM3OjUxLTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhv
dG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYt
Mi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmUzNWFkNDRjLTYxZDctNDMxOS1hMjNiLWMy
NWExNzYzMzM0MSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDplMzVhZDQ0Yy02MWQ3LTQzMTkt
YTIzYi1jMjVhMTc2MzMzNDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMzVh
ZDQ0Yy02MWQ3LTQzMTktYTIzYi1jMjVhMTc2MzMzNDEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpT
ZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAu
aWlkOmUzNWFkNDRjLTYxZDctNDMxOS1hMjNiLWMyNWExNzYzMzM0MSIgc3RFdnQ6d2hlbj0iMjAy
MC0xMi0yOVQxMzowMDo1OS0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9z
aG9wIDIyLjEgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRm
OkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+
mumBiAAAA1pJREFUSMftVVtIk2EY/jCJQKPC7tzFcIKieNh0zLPOw1xYCl5sF8MUJ0MSdGIoONBA
8Ua6GIQZmrJEPEyvZJqEm3N4wAOoczFDQQtvnKGBDtONr/f9cJH+C72Jbhw8fPw///c8z3scoZSS
fwlyK3BjgaGhITI5OXn3/Pw8CJ8PDw/J+vo6mZiYIHa7/dKl1dXVl2q1+lNWVtbHqqqqwdnZWZHT
6SR9fX0S4JFaLJZgjsDa2hrp7+9/bjabjfgMl8jm5iZHAMhfZWdnU7FYTKVSKU1ISKA1NTVf29vb
uysrKx3wfcnGxsY9fxEEwYf6uLg42tvb2z03N0f29/cxKjI+Pk68Xi85OTkRFxUVUR6PR3NycigK
oUhsbCyNiYmhKpXqbGBgwGSz2Uo4Al1dXQ/r6ureCAQCGhERQXU63eednR05uCFWq5V0dnaSlJSU
8tTU1N/kPqAIvi8rK3NPTU09hXsBfosMqVABCRUKhTQ6OpoWFBTQ+vp628jIiBYEHoP78uTk5Evk
iLS0NJqbm0s7OjqejY6Osog5AlAgMj8/L4SPviUmJrKLmN+oqCjmrri42FtRUeHJzMxkjv8UQFNo
pq2tTdTS0kIQHAGTyRTS1NT0Wi6X08LCQpqRkcFSgc7S09NpUlISw9X0IEQiERPY3d0VY/ft7e35
nwOXy6XAYmEd8vLyOET+gAYiIyOpRqNxAkeAx+Mhbrf774MGXaMDN16M4Goq/AEjCg8Pp9CF7y5M
koODA67A2NgYK87i4iJPr9d/l8lkrHjXuceGgPPn8vKyADsOTgaOABSYYXt7+z50zpfQ0FAaHx9P
YVoZkT/nWHA+n4/u356enpKtrS28z8ARWFhYYEN1IfSotbV1sLS01JWfn88KftU5CiN5Y2OjHe4H
X7uLkHhmZoZAm5Lh4WHMZeAH+CERtqHPNZJLJBIaFhZGFQqFY2lp6cGNlt3KyooSajBYW1trUCqV
JsAP3De+wcJWxbnAAcTawNxYHQ5HCAgQ7BzkwNMHf8uO39PTo4Ht6MQWRTIkxyHDCPAdzMdZQ0OD
xWg0Pjk+Pmb38Dw6OuKAIwDdQwwGAwGRQIhECntJrdVq30OWzM3Nzf3V1dUvoJgyWMV3pqenWSFh
td9c4PYv878J/ALq+KmknkhRngAAAABJRU5ErkJggg0K
--MCBoundary=_12207121320313181
Content-Type: image/png; name="3.png"
Content-Disposition: inline; filename="3.png"
Content-Id: <122071213203101914@us-mta-414.us.mimecast.lan>
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAARIAAAAoCAYAAAAyoXVcAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqd
U3dYk/cWPt/3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAo
uGdBiohai1VcOO4f3Ke1fXrv7e371/u855zn/M55zw+AERImkeaiagA5UoU8Otgfj09IxMm9gAIV
SOAEIBDmy8JnBcUAAPADeXh+dLA//AGvbwACAHDVLiQSx+H/g7pQJlcAIJEA4CIS5wsBkFIAyC5U
yBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFS
LALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK/4Klf
cIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44
P5Dn5uTh5mbnbO/0xaL+a/BvIj4h8d/+vIwCBAAQTs/v2l/l5dYDcMcBsHW/a6lbANpWAGjf+V0z
2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s+/zPhb+CLfvb8QB7+23rwAHGaQJmtwKOD
/XFhbnauUo7nywRCMW735yP+x4V//Y4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9
CZN3DQCshk/ATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO/+Y9AKwEAzZek4wAA
vOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgE
tbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKA
pCDpiBRRIsXIcqQCqUJqkV1II/ItchQ5jVxA+pDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPR
dDQPXYCWomvRGrQePYC2oqfRS+h1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3
dhUbwJ5h7wgkAouAE+wIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE+0JXoS+cR4Yjqx
kFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCs
IJeRt5APkE+S+8nD5LcUOsWI4kwJoiRSpJQSSjVlP+UEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAv
U4epEzR1miXNmxZDy6Qto9XQmmlnafdoL+l0ugndgx5Fl9CX0mvoB+nn6YP0dwwNhg2Dx0hiKBlr
GXsZpxi3GS+ZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U/1XmqC1Sr
VQ+rXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O+X/2C+mMNsoaFRqCGSKNUY7fGGY0h
FsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF+xt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4N
znstAy0/LbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7T
Y+t56Qn1yvUO6d3RR/Vt9KP1F+rv1u/RHzcwNAg2kBlsMThj8MyQY+hrmGm40fCE4agRy2i6kcRo
o9FJoye4Ju6HZ+M1eBc+ZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNis
yeyOOdWca55hvtm82/yNhaVFnMVKizaLx5balnzLBZZNlvesmFY+VnlW9VbXrEnWXOss623WV2xQ
G1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7
fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10/Wj
m7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYw
bcjbxFvgvct7YDo+PWX6zukDPsY+Ap96n4e+pr4i3z2+I37Wfpl+B/ye+zv6y/2P+L/hefIW8U4F
YAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG/ljM9xnLJrRFcoInRVa
G/owzCZMHtYRjobPCN8Qfm+m+UzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7
Z72O8Y+pjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h/hF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zk
mlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I/5YMgQlAvGE/lp25NHRPyhJuFT0W+oo2iUbG3
uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvX
MLcot09mKyuTDeR55m3KG5OHyvfkI/lz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b+
6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzy
jlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV+scKyorviwRrjm4ldOX9V89Xlt
2treSrfK7etI66Trbqz3Wb+vSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas
2/KhNqP2ep1/XctW/a2rt77ZJtrWv913e/MOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur/m
ft24R3dPxZ6Pe6V7B/ZF7+tqdG9s3K+/v7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8
e+NQ6KHOw9zDzd+Zf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe+t/9+7zHjY3XHNY9XnqCd
KD3x+eSCk+OnZKeenU4/PdSZ3Hn3TPyZa11RXb1nQ8+ePxd07ky3X/fJ897nj13wvHD0Ivdi2yW3
S609rj1HfnD94UivW2/rZffL7Vc8rnT0Tes70e/Tf/pqwNVz1/jXLl2feb3vxuwbt24m3Ry4Jbr1
+Hb27Rd3Cu5M3F16j3iv/L7a/eoH+g/qf7T+sWXAbeD4YMBgz8NZD+8OCYee/pT/04fh0kfMR9Uj
RiONj50fHxsNGr3yZM6T4aeypxPPyn5W/3nrc6vn3/3i+0vPWPzY8Av5i8+/rnmp83Lvq6mvOscj
xx+8znk98ab8rc7bfe+477rfx70fmSj8QP5Q89H6Y8en0E/3Pud8/vwv94Tz+4A5JREAAAAZdEVY
dFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAARF0lEQVR42uxdCbhW0xreqVSmigZzqSSX
a7gpHSkNJCpCQorMIUm5lOFKLjLdiNslGpDmq0FUUrrRNTVSUUlFmSIaaNS573t7t/O17L3//3RO
nv8c63ue71n/Xvtbe6+99lrfvPZfJDs7O/DgwYOHvMAefgg8ePDgGYkHDx48I/HgwYMHDx52K1St
VLm9HwWvkXjw4MEzEg8ePHhIDcX8EHj4A5pLFVFcBCwCHL50xfKvY+gOQlEPWBlYFPgDcB5wFtps
KeBjsCeKP5mqLXimhQWWkTg28Bo8zLgYutrOg08F7ef52A9OFvZlLq47xi+3PI/n+SgOBm4DzsSY
zsyQfh1CRgCsqKq7UFcL/VtuaI5E8QjwHDEbF74HzUCUD6LdmgL6ivhu5pjjFWKY6YxhSxRbgcvI
fHBcIxNMm4EGeybQtXFo/5LP/eAg3gNs6dlAnhfrgShKAo/VuNbLoO5da5gIoRzwOtP3xtI6zo1h
IoQDgLcCP9Gz/tHgCGAF4P14/jNQvupNGw+7A7i4KOEbyiTYlEF92yeibl8xkcNRjAaWSvNa412z
CNdohaKjqRoFmqcK2ftdBvwRuAp4B489I8mBt4FlaSv6ocgzfAj8GyWVmEomzbOhwJuAxXX8C/BF
/b41ZCoGXgL+G7gaeIg0ldZAmtU3R1z/UOBp5nhuIXy/s7VOXgCTfJ9uB89IBBiQbeKyHvI+ltsx
uR6QRkKf07sZ1LeZ6Fsj/LxepsszqHtPp5s45Pfj3F1O3XC0fxhlCZxb/wd9v6Fv8msdv1/MUcuo
9p0HrCtnzGbgAuBIEC/A+XKyMemfmIS6Z532bNcMWAVIr/A3wDeAr1gvN+hOQPF4RB+r4dw0/d6A
Ns1xTDrSV3No/45znfW7F/B14DijuvIln4NrZDt9pBOtlvW9gOZL06eJOO5l6Jui6AYchPpBGqO2
wFN1r9U6N8MZx7byDewtmnGgeSXBr0B/1VnAM4GHq5rtZmj8f0poS+naAthAUrOo1M/XNP6XAjsB
98N1aph2peQTaiC/wTpJ0KGg+yrhfnXVrpoWIyfUVOCY8D2rnJShC+FtaaBRJpmFyTHt5wYedoJi
jm33tBxJFlh/D84PR9lYzinCStO2Eor+Ou9CB+Ai0LTDC/hAdWUc9S+EvU39WpUnxNAeY34PkhTc
IEYWwvFWtcR5OgBvAO6lqkVkIk6flkdMLtZP0wIaosX6PnA7kM6mq3GuG671EMqGUocrRND8AzRd
IxZmJanPNYFrxLw3SkJeTTMBNKej7WcRbU9BMVgOsKXAJWJwfBed9Z4oFKYD/+O0e1FMf4meuyqw
HfBenO+E+w107sX5MlBMktrbRzrF8aHD8lPQtEa7OZk86dHHMQ5jCB3sHPvS5tQ1oJ3uCiPnWleJ
if9a5ZC0UETQQn9XqICGwvkKYCPNr2y9uykcc9DPS/FMZOjna73W1jv/me9EAqVfknCIueaFEkIW
aApyri/5DSNRqG5kiutepHKdJt6naltO3P3QhLZHUTJyIaID83fjHBlp+hlIwlvp0cAwkSCNZ7Zw
OrA7pS7wTjxH+PzlUbwDfAC/t0o7Gi6az0XDfIS3gF3w+2n7EjR+XODltRg5abaa8xeLef1Tz2Nf
NMd1gphOI7R705zjc97He5IG584252pIgyOzboxzU50JPQI4AL+/d8LxN4qJjAJejnM/m3vRv8Co
1+s4PgnnVmQwLzk3pn6iTJ4QuIiq4Hnuk6YaxVD+nHC9QIy6ilM3zYz3fij+FeyISrpA4cbIVyfQ
DULZMRxzZx5Ul+/HjWSWFFMh3g66O9D+8TSZCAXYM8HOSau0UC5xmQhhDzQogbKvqVsnZ1IpSdW+
Tpt7cKGTjCe6j2Ei27XYyukhWsi8IXDABuk3cwpOFFpYbOrDkOHVOh7i0HYxtOFkJ+e1JsDZTpvm
zvGIXEy+LC4kPPdFIRORNFuticABp9nUAXXtbI6LJEF/HZ7qXPcmSY8zQdfPMhG1HaZF30STzkJP
jWsby0TU7mdpP5RoZ4lBhNBPzsamlomo3WxpQpywfaSFhHChyp0mtO7VU4zwJZlkBREejPCTZWle
fUxTGlgmHzWjfWU+tUlBWkTaymStV3uNWtJ8U6VDcD33Bn3vNPrFtfWsw0TWab6MjjNt6gY7x9W7
gjiU1Azb3UgJI64WaLI8rhtWdjSAp6x/ATAeNG2NrVkTxw1AMy3UFHBs+7PRtT+N5Hcn57II2o2g
G2/6dAqOy6L+hwhGQrPmo1y8d2oSz8Wc+17lo6AZEEMTqpWlnfoewGFo93HCvRfJd3KIXqjVuFa6
zMCB0TJzqDLPxniETLpv3PPThJIEvEFm2QSd2l/lTzHtnivgTsQv5BPjmB0UoVVzEfaQ3+5hMdNP
rckooWrNm1Wh9m5gpRHCtZ1zlPpzxDxOlK8xBJqjj0r4hL64lyPmFOf7fL0v6wKgoF+RgoncG+yI
uFn4ToJudlw7cpzDnLpZEXQfWIeoI/Et1xoW0XaKWWiEprt5Pox0nq+JBogqYqVdNGuCNKXsV7sw
ebPjmAi1AeDJQU5GbwnHdNk3jX59aySSHf9Uzz/G+D/cudFHjtrCGJF4T+YK1fqtESSlZcIx+lOF
mjmwQYgUpg79KHteOApteY/LHVqun4NxPgtYR0zJ1QCuR9twDXZ2XApkFLfRkkD7+sBjZRrNkVLQ
OsG0KYLrPhHBROg7y0piIqFG8qVT1yQwqbPKyW9kzq81v2u6TiTQR+Vh7JPgjMpvCM2bvY3UHp5H
s+b3dATWlElYH1gniEmOojQELdXwSiiL4viXmEuGKl/4no9T2UiRqjgoq7KGqeMkayg1uyXakxkx
V+TNwhQKxbNQ8HWQdGaU8hppgxaOlj+oJujX7sJt2gQ7Z87+l/4n+x5pNuP61K7fNaZLUflu7o1g
RHQ7POI8ywIFAKqbYEcUMFLYyamjVnMW2q1M9TDF5PhZahb4fWIeY+Xs6a5BC8Gq0RUiBjcVlNvN
k8A1b5rKo50Xs2Z3M4/imrC36D1QvWXY9nY5srvIyenCC3r5HeSMda9LreXKYEfykGue3J1m98qY
sV2Ga5IRddVkvla4BfX04zCiMzopylHAGAo1TEaw7g92pEWwPNIRijcHyVs74sD1lfWOEgb0mcmU
esH6bVBXwbEONsv0inqOtY5VkQ4wgNDMuAWSGYk62kp23n5ywvWMGZz1Uuus6WBhspx0STD/d5gD
NnpTUVpWVh7Mmt3JREL1lX4ohncZNRiM97LB0MRpG0yWaiBTg9cZQI+6GEiWpBY1im4mzL091FR2
JbKiTWp3EmUu0ofSTEhmPQn1FyTlvRRAhsJkxZF4roliyHXN6Va7yEjcnJUkwbYwom1Ft5v5POZF
zVxJzUg0UHMxSI9p4iUxgKsce/47h6Y7zs/KgHfvmje9HaY3JEOYCDWloWIi9JIzdyM3+1LIbOjc
pcRi0lw3x3lNR197XPN5U7fGTMYVeVxg8zUvGA2oqr7QKfxAEJ0+XtAZyno8J5m3jZAduYuXc03B
A9IwM0OgsN7o1O2fx8fbFuy8laG2TLcm6ZhuDP8SBxsmQucKE5XoeKG9dauk23FMhU2hXdTKkBfO
QR4fY3LNTxEh+T3hRKm4HNfrcslECM9r0TaT043hWeZ6XKaJUMlhIlby1cnnMad5fK4meJuCyiwY
ZQQelkDiOmBdbdE16/aMuc5i5zhp1/k5zvEnwY69PpaZHIh+ZyU8V4UUj06h09GpC5lJ6ZSMRCaA
zV5jBuVlwM7A24CPca9EjN070Tm+Uf4V9yG6MjU9Ig/ChSL5bN5EQSY5WaurHJdbv4I+zsMs1A/Q
9jXgKkYDgAzrvkjHWowDdqpx9qW6x8VKmPtVg5IWFcdM6Pz9KkKCFhQmcql8Ee/hd4sYDbJTCrPj
G+e4Rszt3O/udNYeIPeeDBbc4LbVFoQJTv2AqM8aoI6CZTnKjimEAf1s3SOYyWQlXiaaNoc7dW/J
ccaw4Q9Shfmb2WyLbMIUHZag5cQMB4A286uo+5vU5iMkIS/R+XY4d31cUgufWR8w4v2qgm5KQt/r
g5ZmFDktP4i0LIV5k3H+ESO99kqY3BfIDndhk/A00NAhO1OmJs2dLVJ/OakXWl+Idmty3GqjZJbi
0Jj7tpLZxf0yTTWRXpLT7s6YNlX1zj8qgEyklZgImQVzSMahjnlKL2vulxbzre80dc1kN5W9odwG
w0MTQqFUCrQexjQqLulP6+CNICd14RLHLJ9vmBAT6M53mNZ8XIP5POw7HeXnBTmbEZ9kHhddFAnM
pJfM4wcdS2MqGZ0SMCMZyWBxvJChcBAvj7PJcbFh8oWE/hFGDDgxw+3XpwujgBqJG25eGeTEwrno
w52YawMTMZAj0sItQgLDkctc88aJ3oRmzScZNH9nyDa9En3tZxe80th7qP+bVV3SPN9afVSml5x/
dRMWCaVmD5NoyHfGcGP/0E9jNSIxLy6q1aIN3wcn+x04z/d0l+MQPlRMuoj6VNAgK/ht8OAEYRyQ
afR15t3HYtQ2NaKLkEAmwpDxNtAxrDw5yPmkQVGtvbj1t0l+yu2610wxqa6Or+X2hD4zObFikPC5
DDGTEpp/gVESYpnJHlSJxWVnpDHYzAdhyvp0bYALlHdP9euLFG2ZnVnPbNkO4dE0X/SQCLUxFYzL
YLMmUHy+mxyfjPczE3gokBOUfpymclo+7DrdmDui85ywDNW3B54c5GwbOEPa4FhJqhFoc0U4AWWT
/yQtYzEFhO5NSca9NNzR2zj8BKFU6Wbyy7BPqxjFYAYscKykNpOsusRpORnuSO0q6f9tmk2oGTSP
+XbrNdIMo+CYcNsB2jJS2iLYOTcrDtbofq6fkgloT6bZZ5qdZ+Aai9MYD/pMH3KqQ2ZSPsrZSiaw
wEi0EfKZnKeBpZfaNTGOtg4gbaE/SprNK1JtObGYSEM1ixLu2KiIDuro1G0t5+gCtX1XC8DSfScV
60mp11xoc6R6L40Zj/W5YCQbJGE+j3iB87Swkl7yvCA5yzSShj6oYEcId7TMtMP1bBxLhmiZRv2h
2pZ0pNz/w7DcvUqnKicZI3DCN+QvaRnk7Ij+q7kvTb9qYgoc9yo65lhyG8Qxbq6N9tSQYR0vSbxd
k4uaZh+16R0UUNC+puryEyyJISOjYQ5OrbhELe1+rqN14/q+ShjfGGkniQEPCH4biQnE7J/R+pkS
ca/tQPptmHT2VsT9wrnNjNvjcvPtXNB2S5eZ0HlGiROmjo81W6qjbPVRpqq7s68mE+3eYca0mYb+
NgwKCei7LUxfPyCdDxCDnoywJGjLFLDnZPh6UD5fs0yEkziKrooWzv5Bzpb8uaFpkea9uOAY3i8n
M3alHOSbImjD3brhZwRoLVA4bM7F/SiMmAVbXtegS2CWew19/8YGP8iQ1qUzXoKN9pquszU7hWPW
wpIMnHT8atVm2fDXOv6Rh4LCBZuMzTsyxbjUk138TuAhlnFE0H0W4ZvL7b2ogU5Ik5bvdHoe70eN
aWIadGSGP+bXeBWTczPMKeD+CaplU8UNqRKVltljY9mzZcJkGnyjrM7iTv1kDMbEQrYenpAfZLA2
9oXRBWonpSRFaYI2l82+Uf4YDx7yHchImItAezkMQ6XyVDM03DaD/yDIZSI03doXQqk6QXkHTM9m
9KprDGmYb3B3Ju0vygX4j3EXACgi1ZdJZK0lvchEKgc5W9Y3SL2jWjxM3xLJVHuajtIwK5EaFR22
PeJi34XIX1JWtvzBQc5uYTqaGU5eGPVVLQ8e8pWRZGdn+1Hw4MFDnsD/ibgHDx48I/HgwYNnJB48
ePCMxIMHDx48I/HgwUM+wP8EGAAzW/nyspFdbgAAAABJRU5ErkJggg0K
--MCBoundary=_12207121320313181
Content-Type: image/jpeg; name="4.jpg"
Content-Disposition: inline; filename="4.jpg"
Content-Id: <122071213203102014@us-mta-414.us.mimecast.lan>
Content-Transfer-Encoding: base64

/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QN5aHR0cDov
L25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENl
aGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4
OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA3LjEtYzAwMCA3OS5lZGEyYjNmYWMsIDIwMjEvMTEvMTct
MTc6MjM6MTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcv
MTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIi
IHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJl
Zj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6
eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50
SUQ9InhtcC5kaWQ6NjU0NmM2MWItN2Q0OC00ZWZiLWFhOWItOGU0NTBlNGQ2ZmU2IiB4bXBNTTpE
b2N1bWVudElEPSJ4bXAuZGlkOjRFOTJEQTVGOTM1NDExRUM5MjY0Qzc0ODRDN0ZEMkVGIiB4bXBN
TTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRFOTJEQTVFOTM1NDExRUM5MjY0Qzc0ODRDN0ZEMkVGIiB4
bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi4xIChNYWNpbnRvc2gpIj4gPHhtcE1N
OkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NUVFQ0M5RUY4RUE0MTFFQ0E1
QkVCMTY0NTRBQjU1NzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NUVFQ0M5RjA4RUE0MTFF
Q0E1QkVCMTY0NTRBQjU1NzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94Onht
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
ST6swU8sDJ//2Q0K
--MCBoundary=_12207121320313181--


--===============1408693865363875483==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

--===============1408693865363875483==--

@ffmpeg-codebot
Copy link

User Bryce Newman <bryce.newman@gettyimages.com> has been added to the cc: list.

@ffmpeg-codebot
Copy link

Invalid author email in 7d798f3: "brycechesternewman@users.noreply.github.com"

@ffmpeg-codebot
Copy link

There is a merge commit in this Pull Request:

7d798f309d7e820d2840956ccb1506f76b9cdc75

Please rebase the branch and force-push.

@brycechesternewman
Copy link
Author

/submit

@ffmpeg-codebot
Copy link

Invalid author email in 7d798f3: "brycechesternewman@users.noreply.github.com"

@ffmpeg-codebot
Copy link

There is a merge commit in this Pull Request:

7d798f309d7e820d2840956ccb1506f76b9cdc75

Please rebase the branch and force-push.

@brycechesternewman
Copy link
Author

/submit

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

Invalid author email in 7d798f3: "brycechesternewman@users.noreply.github.com"

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

There is a merge commit in this Pull Request:

7d798f309d7e820d2840956ccb1506f76b9cdc75

Please rebase the branch and force-push.

@brycechesternewman
Copy link
Author

/submit

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

Invalid author email in 7d798f3: "brycechesternewman@users.noreply.github.com"

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

There is a merge commit in this Pull Request:

7d798f309d7e820d2840956ccb1506f76b9cdc75

Please rebase the branch and force-push.

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

Invalid author email in 7d798f3: "brycechesternewman@users.noreply.github.com"

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

There are merge commits in this Pull Request:

7d798f309d7e820d2840956ccb1506f76b9cdc75
752205880a7882c6bb784bf7c0a6ff474a8d6eaa

Please rebase the branch and force-push.

mkver and others added 9 commits October 3, 2022 08:10
Some audio codecs work with atomic units that decode to a fixed
number of audio samples with this number being so small that it is
common to put multiple of these atoms into one packet. In these
cases it makes no sense to pad the last frame to the big frame_size,
so allow encoders to set the number of samples that they want
the last frame to be padded to instead.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Do this by setting AVCodecInternal.pad_samples.
This prevents reading into the frame's padding and writing
into the packet's padding.

This actually happened in our FATE tests (where the number of samples
is 2 mod 4), which therefore needed to be updated.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
While this probably never overflows, we are better safe than sorry.

The callback prototype should probably also use ptrdiff_t or size_t,
but I diggress (this would affect the DSP callback prototype).
... for a difference between pointers.
The compiler cannot infer that the two float vectors do not alias,
causing unnecessary extra loads and serialisation. This patch caches
the two input values in local variables so that compiler can optimise
individual loop iterations.
Only used there. Also make it static.

Reviewed-by: James Almer <jamrial@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Up until now, using NULL as key in av_dict_get() on a non-empty
AVDictionary would crash; using NULL as key in av_dict_set()
would also crash for a non-empty AVDictionary unless AV_DICT_MULTIKEY
was set; in case the dictionary was initially empty or AV_DICT_MULTIKEY
was set, it was even possible for av_dict_set() to succeed when
adding a NULL key, namely when one uses a value != NULL and
the AV_DICT_DONT_STRDUP_VAL flag. Using av_dict_get() on such
an AVDictionary will usually lead to crashes, though.

Fix this by actually checking for key in both functions; error out
if they are NULL.

While just at it, also stop relying on av_strdup(NULL) to return NULL
in av_dict_set().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Up until now, libswscale/input.c used a macro to read
an input pixel which involved a call to av_pix_fmt_desc_get()
to find out whether the input pixel format is BE or LE
despite this being known at compile-time (there are templates
per pixfmt). Even worse, these calls are made in a loop,
so that e.g. there are six calls to av_pix_fmt_desc_get()
for every pair of UV pixel processed in
rgb64ToUV_half_c_template().

This commit modifies these macros to ensure that isBE()
is evaluated at compile-time. This saved 9743B of .text
for me (GCC 11.2, -O3). For a simple RGB64LE->YUV420P
transformation like
ffmpeg -f lavfi -i haldclutsrc,format=rgba64le -pix_fmt yuv420p \
-threads 1  -t 1:00  -f null -
the amount of decicycles spent in rgb64LEToUV_half_c
(which is created via the template mentioned above)
decreases from 19751 to 5341; for RGBA64BE the number
went down from 11945 to 5393. For shared builds (where
the call to av_pix_fmt_desc_get() is indirect) the old numbers
are 15230 for RGBA64BE and 27502 for RGBA64LE, whereas
the numbers with this patch are indistinguishable from
the numbers from a static build.

Also make the macros that are touched conform to the
usual convention of using uppercase names while just at it.

Reviewed-by: Anton Khirnov <anton@khirnov.net>
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Up until now, libswscale/output.c used a macro to write
an output pixel which involved a call to av_pix_fmt_desc_get()
to find out whether the input pixel format is BE or LE
despite this being known at compile-time (there are templates
per pixfmt). Even worse, these calls are made in a loop,
so that e.g. there are eight calls to av_pix_fmt_desc_get()
for every pixel processed in yuv2rgba64_X_c_template()
for 64bit RGB formats.

This commit modifies these macros to ensure that isBE()
is evaluated at compile-time. This saved 41184B of .text
for me (GCC 11.2, -O3). Of course, it also improved performance.
E.g. ffmpeg_g -f lavfi -i testsrc2,format=yuva420p -pix_fmt rgba64le \
-threads 1  -t 1:00  -f null - (which uses yuv2rgba64le_X_c,
which is an invocation of yuv2rgba64_X_c_template() mentioned above),
performance improved from 95589 to 41387 decicycles for one call
to yuv2packedX; for the be variant the numbers went down from
76087 to 43024 decicycles.

Reviewed-by: Anton Khirnov <anton@khirnov.net>
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
mkver and others added 26 commits October 3, 2022 08:11
Fixes the rv20-1239 FATE-test.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This is currently 64-bit only because the stack spilling code would not
assemble on RV32I (and it would corrupt s0 and s1 on RV128I, in theory).

This could be added later in the unlikely that someone wants it.
ff_check_pixfmt_descriptors() was added in commit
20e99a9. At this time,
the values of enum AVPixelFormat were not contiguous;
instead there was a jump from 111 to 291 (or from 115
to 295 depending upon AV_PIX_FMT_ABI_GIT_MASTER).
ff_check_pixfmt_descriptors() accounts for this
by skipping empty descriptors. Yet this issue no longer
exists: There are no holes.

The check for said holes makes GCC believe that the name
can be NULL; because it is used as argument corresponding to
%s in a log statement, it therefore emits a warning
(since d75c469). Therefore
this commit simply removes these checks.

Also move the checks for name before the log statement.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Instead use av_pix_fmt_desc_next(). It is still possible
to check its return values by comparing it with the
(currently) expected values and the code does so.

Reviewed-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Namely to lavu/tests/pixelutils.c. This way, this function will
not be included into actual binaries any more.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
These are test tools, so they should be picky.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Regression since 9a494b8.

Reviewed-by: James Almer <jamrial@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
lavu minor bump was apparently forgotten for those, so mention them in
the block adding av_chroma_location*(), which was the next lavu minor
bump.
This allows av_mediacodec_release_buffer to be called safely after
the decoder is closed, this was already the case with delay_flush=1.
Note that this causes holding onto frames to keep the decoding context
alive which is generally considered to be the intended behavior.

Signed-off-by: sfan5 <sfan5@live.de>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
The code that uses these was removed in
ecee3b0

Signed-off-by: Anton Khirnov <anton@khirnov.net>
The code that defined videotoolbox_init was removed in
4b54818

Signed-off-by: Anton Khirnov <anton@khirnov.net>
Unused since removal of the -deinterlace option in
d013453

Signed-off-by: Anton Khirnov <anton@khirnov.net>
Unused since the bits_per_raw_sample was made a per-output-stream
option in 4258893

Signed-off-by: Anton Khirnov <anton@khirnov.net>
It is only used by three of the thirty files that (potentially
indirectly) include mpeg4audio.h. Twenty of these files won't
have a put_bits.h inclusion any more after this patch.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This check is intended to be avoid buffer overflows,
yet there are four problems with it:
1. It has an in-built off-by-one error: len == out_end - out
is perfectly fine and nothing to worry about.
This off-by-one error led to the pixel in the lower-right corner
not being set properly for the back frame of the sample from
the rl2 FATE-test. This pixel is copied to every frame which
is the reason for the update to the reference file of said test.
With this patch, the output of the decoder matches the output
as captured from the reference decoder* (apart from the fact
that said reference somehow lacks the top part of the frame
(copied over from the background frame)).
2. Given that the stride of the buffer may be different
from the width of the video (despite one pixel taking one byte),
there is a second check lateron making the first check redundant
(if one returns immediately; a simple break at the second check
is not sufficient, because it only exits the inner loop).
3. The check is based around the assumption of the stride being
positive (it has this in common with the other check which
will be fixed in a future commit).
4. Even after fixing the off-by-one error, the check in
question is still triggered by all the non-background frames
in the FATE sample as well as by A1100100.RL2. In all these
cases, they use len == 255 and val == 128. For videos with
background frame this just means "copy from the background
frame", which would be done anyway lateron.* Yet for videos
without it copying it is necessary to avoid leaving
uninitialized parts in the video.

*: Available in https://samples.mplayerhq.hu/game-formats/voyeur-rl2/
**: Due to this, the code that copies the rest from the
back frame is no longer executed for any of the samples
available on the sample server. Given that these are only
the files from the demo version of this game, I don't know
whether this code is executed for any file in existence or not.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Don't increment back_frame if it does not correspond
to a real buffer. To do this, handle copying from
the back frame separately from the "use coded value"
codepath; also use memcpy for the former, as the
chunks here are typically worth it.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
@brycechesternewman
Copy link
Author

/submit

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

The pull request has 3025 commits. The max allowed is 100. Please split the patch series into multiple pull requests. Also consider squashing related commits.

1 similar comment
@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Oct 3, 2022

The pull request has 3025 commits. The max allowed is 100. Please split the patch series into multiple pull requests. Also consider squashing related commits.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet