diff mbox

[FFmpeg-devel,PATCHv3,2/3] mov: Export bounds and padding from spherical metadata

Message ID 20170221223553.65520-2-vittorio.giovara@gmail.com
State Accepted
Headers show

Commit Message

Vittorio Giovara Feb. 21, 2017, 10:35 p.m. UTC
Update the fate test as needed.
---
 libavformat/mov.c                 | 28 +++++++++++++++++++++++++++-
 tests/ref/fate/mov-spherical-mono |  6 +++++-
 2 files changed, 32 insertions(+), 2 deletions(-)

Comments

James Almer Feb. 21, 2017, 11:07 p.m. UTC | #1
On 2/21/2017 7:35 PM, Vittorio Giovara wrote:
> Update the fate test as needed.
> ---
>  libavformat/mov.c                 | 28 +++++++++++++++++++++++++++-
>  tests/ref/fate/mov-spherical-mono |  6 +++++-
>  2 files changed, 32 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 7b0bbcc..d798336 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -4637,6 +4637,8 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>      MOVStreamContext *sc;
>      int size, version;
>      int32_t yaw, pitch, roll;
> +    size_t l, t, r, b;
> +    size_t padding = 0;
>      uint32_t tag;
>      enum AVSphericalProjection projection;
>  
> @@ -4716,9 +4718,25 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>      switch (tag) {
>      case MKTAG('c','b','m','p'):
>          projection = AV_SPHERICAL_CUBEMAP;
> +        padding = avio_rb32(pb);

Doesn't layout come first?

>          break;
>      case MKTAG('e','q','u','i'):
> -        projection = AV_SPHERICAL_EQUIRECTANGULAR;
> +        t = avio_rb32(pb);
> +        b = avio_rb32(pb);
> +        l = avio_rb32(pb);
> +        r = avio_rb32(pb);
> +
> +        if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
> +            av_log(c->fc, AV_LOG_ERROR,
> +                   "Invalid bounding rectangle coordinates "
> +                   "%zu,%zu,%zu,%zu\n", l, t, r, b);
> +            return AVERROR_INVALIDDATA;
> +        }
> +
> +        if (l || t || r || b)
> +            projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
> +        else
> +            projection = AV_SPHERICAL_EQUIRECTANGULAR;
>          break;
>      default:
>          av_log(c->fc, AV_LOG_ERROR, "Unknown projection type\n");
> @@ -4735,6 +4753,14 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>      sc->spherical->pitch = pitch;
>      sc->spherical->roll  = roll;
>  
> +    sc->spherical->padding = padding;
> +
> +    if (projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
> +        sc->spherical->bound_left   = l;
> +        sc->spherical->bound_top    = t;
> +        sc->spherical->bound_right  = r;
> +        sc->spherical->bound_bottom = b;
> +    }
>      return 0;
>  }
>  
> diff --git a/tests/ref/fate/mov-spherical-mono b/tests/ref/fate/mov-spherical-mono
> index 8048aff..a70d879 100644
> --- a/tests/ref/fate/mov-spherical-mono
> +++ b/tests/ref/fate/mov-spherical-mono
> @@ -8,7 +8,11 @@ inverted=0
>  [SIDE_DATA]
>  side_data_type=Spherical Mapping
>  side_data_size=56
> -projection=equirectangular
> +projection=tiled equirectangular
> +bound_left=148
> +bound_top=73
> +bound_right=147
> +bound_bottom=72
>  yaw=45
>  pitch=30
>  roll=15
>
James Almer Feb. 28, 2017, 3:58 p.m. UTC | #2
On 2/21/2017 8:07 PM, James Almer wrote:
> On 2/21/2017 7:35 PM, Vittorio Giovara wrote:
>> Update the fate test as needed.
>> ---
>>  libavformat/mov.c                 | 28 +++++++++++++++++++++++++++-
>>  tests/ref/fate/mov-spherical-mono |  6 +++++-
>>  2 files changed, 32 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index 7b0bbcc..d798336 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -4637,6 +4637,8 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>      MOVStreamContext *sc;
>>      int size, version;
>>      int32_t yaw, pitch, roll;
>> +    size_t l, t, r, b;
>> +    size_t padding = 0;
>>      uint32_t tag;
>>      enum AVSphericalProjection projection;
>>  
>> @@ -4716,9 +4718,25 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>      switch (tag) {
>>      case MKTAG('c','b','m','p'):
>>          projection = AV_SPHERICAL_CUBEMAP;
>> +        padding = avio_rb32(pb);
> 
> Doesn't layout come first?
> 
>>          break;
>>      case MKTAG('e','q','u','i'):
>> -        projection = AV_SPHERICAL_EQUIRECTANGULAR;
>> +        t = avio_rb32(pb);
>> +        b = avio_rb32(pb);
>> +        l = avio_rb32(pb);
>> +        r = avio_rb32(pb);
>> +
>> +        if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
>> +            av_log(c->fc, AV_LOG_ERROR,
>> +                   "Invalid bounding rectangle coordinates "
>> +                   "%zu,%zu,%zu,%zu\n", l, t, r, b);
>> +            return AVERROR_INVALIDDATA;
>> +        }
>> +
>> +        if (l || t || r || b)
>> +            projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
>> +        else
>> +            projection = AV_SPHERICAL_EQUIRECTANGULAR;
>>          break;
>>      default:
>>          av_log(c->fc, AV_LOG_ERROR, "Unknown projection type\n");
>> @@ -4735,6 +4753,14 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>      sc->spherical->pitch = pitch;
>>      sc->spherical->roll  = roll;
>>  
>> +    sc->spherical->padding = padding;
>> +
>> +    if (projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
>> +        sc->spherical->bound_left   = l;
>> +        sc->spherical->bound_top    = t;
>> +        sc->spherical->bound_right  = r;
>> +        sc->spherical->bound_bottom = b;
>> +    }
>>      return 0;
>>  }
>>  
>> diff --git a/tests/ref/fate/mov-spherical-mono b/tests/ref/fate/mov-spherical-mono
>> index 8048aff..a70d879 100644
>> --- a/tests/ref/fate/mov-spherical-mono
>> +++ b/tests/ref/fate/mov-spherical-mono
>> @@ -8,7 +8,11 @@ inverted=0
>>  [SIDE_DATA]
>>  side_data_type=Spherical Mapping
>>  side_data_size=56
>> -projection=equirectangular
>> +projection=tiled equirectangular
>> +bound_left=148
>> +bound_top=73
>> +bound_right=147
>> +bound_bottom=72
>>  yaw=45
>>  pitch=30
>>  roll=15
>>

CCing this time because i forgot last time. Sorry
Vittorio Giovara Feb. 28, 2017, 4:24 p.m. UTC | #3
On Tue, Feb 28, 2017 at 10:58 AM, James Almer <jamrial@gmail.com> wrote:
> On 2/21/2017 8:07 PM, James Almer wrote:
>> On 2/21/2017 7:35 PM, Vittorio Giovara wrote:
>>> Update the fate test as needed.
>>> ---
>>>  libavformat/mov.c                 | 28 +++++++++++++++++++++++++++-
>>>  tests/ref/fate/mov-spherical-mono |  6 +++++-
>>>  2 files changed, 32 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>> index 7b0bbcc..d798336 100644
>>> --- a/libavformat/mov.c
>>> +++ b/libavformat/mov.c
>>> @@ -4637,6 +4637,8 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>      MOVStreamContext *sc;
>>>      int size, version;
>>>      int32_t yaw, pitch, roll;
>>> +    size_t l, t, r, b;
>>> +    size_t padding = 0;
>>>      uint32_t tag;
>>>      enum AVSphericalProjection projection;
>>>
>>> @@ -4716,9 +4718,25 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>      switch (tag) {
>>>      case MKTAG('c','b','m','p'):
>>>          projection = AV_SPHERICAL_CUBEMAP;
>>> +        padding = avio_rb32(pb);
>>
>> Doesn't layout come first?

Ah, that's right, thanks
James Almer March 7, 2017, 9:49 p.m. UTC | #4
On 2/28/2017 1:24 PM, Vittorio Giovara wrote:
> On Tue, Feb 28, 2017 at 10:58 AM, James Almer <jamrial@gmail.com> wrote:
>> On 2/21/2017 8:07 PM, James Almer wrote:
>>> On 2/21/2017 7:35 PM, Vittorio Giovara wrote:
>>>> Update the fate test as needed.
>>>> ---
>>>>  libavformat/mov.c                 | 28 +++++++++++++++++++++++++++-
>>>>  tests/ref/fate/mov-spherical-mono |  6 +++++-
>>>>  2 files changed, 32 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>>>> index 7b0bbcc..d798336 100644
>>>> --- a/libavformat/mov.c
>>>> +++ b/libavformat/mov.c
>>>> @@ -4637,6 +4637,8 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>>      MOVStreamContext *sc;
>>>>      int size, version;
>>>>      int32_t yaw, pitch, roll;
>>>> +    size_t l, t, r, b;
>>>> +    size_t padding = 0;
>>>>      uint32_t tag;
>>>>      enum AVSphericalProjection projection;
>>>>
>>>> @@ -4716,9 +4718,25 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>>>>      switch (tag) {
>>>>      case MKTAG('c','b','m','p'):
>>>>          projection = AV_SPHERICAL_CUBEMAP;
>>>> +        padding = avio_rb32(pb);
>>>
>>> Doesn't layout come first?
> 
> Ah, that's right, thanks

You pushed this patch without fixing it...
diff mbox

Patch

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 7b0bbcc..d798336 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -4637,6 +4637,8 @@  static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     MOVStreamContext *sc;
     int size, version;
     int32_t yaw, pitch, roll;
+    size_t l, t, r, b;
+    size_t padding = 0;
     uint32_t tag;
     enum AVSphericalProjection projection;
 
@@ -4716,9 +4718,25 @@  static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     switch (tag) {
     case MKTAG('c','b','m','p'):
         projection = AV_SPHERICAL_CUBEMAP;
+        padding = avio_rb32(pb);
         break;
     case MKTAG('e','q','u','i'):
-        projection = AV_SPHERICAL_EQUIRECTANGULAR;
+        t = avio_rb32(pb);
+        b = avio_rb32(pb);
+        l = avio_rb32(pb);
+        r = avio_rb32(pb);
+
+        if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
+            av_log(c->fc, AV_LOG_ERROR,
+                   "Invalid bounding rectangle coordinates "
+                   "%zu,%zu,%zu,%zu\n", l, t, r, b);
+            return AVERROR_INVALIDDATA;
+        }
+
+        if (l || t || r || b)
+            projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
+        else
+            projection = AV_SPHERICAL_EQUIRECTANGULAR;
         break;
     default:
         av_log(c->fc, AV_LOG_ERROR, "Unknown projection type\n");
@@ -4735,6 +4753,14 @@  static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     sc->spherical->pitch = pitch;
     sc->spherical->roll  = roll;
 
+    sc->spherical->padding = padding;
+
+    if (projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
+        sc->spherical->bound_left   = l;
+        sc->spherical->bound_top    = t;
+        sc->spherical->bound_right  = r;
+        sc->spherical->bound_bottom = b;
+    }
     return 0;
 }
 
diff --git a/tests/ref/fate/mov-spherical-mono b/tests/ref/fate/mov-spherical-mono
index 8048aff..a70d879 100644
--- a/tests/ref/fate/mov-spherical-mono
+++ b/tests/ref/fate/mov-spherical-mono
@@ -8,7 +8,11 @@  inverted=0
 [SIDE_DATA]
 side_data_type=Spherical Mapping
 side_data_size=56
-projection=equirectangular
+projection=tiled equirectangular
+bound_left=148
+bound_top=73
+bound_right=147
+bound_bottom=72
 yaw=45
 pitch=30
 roll=15