Quoting Vittorio Giovara (2017-02-10 22:08:09)
> Signed-off-by: Vittorio Giovara <[email protected]>
> ---
>  avprobe.c             | 15 +++++++++++---
>  doc/APIchanges        |  5 +++++
>  libavformat/dump.c    | 10 +++++++++
>  libavutil/spherical.h | 56 
> +++++++++++++++++++++++++++++++++++++++++++++++++++
>  libavutil/version.h   |  2 +-
>  5 files changed, 84 insertions(+), 4 deletions(-)
> 
> diff --git a/avprobe.c b/avprobe.c
> index a24e644..7e20da1 100644
> --- a/avprobe.c
> +++ b/avprobe.c
> @@ -792,11 +792,20 @@ static void show_stream(InputFile *ifile, InputStream 
> *ist)
>                  spherical = (AVSphericalMapping *)sd->data;
>                  probe_object_header("spherical");
>  
> -                if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR)
> +                if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR) {
>                      probe_str("projection", "equirectangular");
> -                else if (spherical->projection == AV_SPHERICAL_CUBEMAP)
> +                } else if (spherical->projection == AV_SPHERICAL_CUBEMAP) {
>                      probe_str("projection", "cubemap");
> -                else
> +                    probe_int("padding", spherical->padding);
> +                } else if (spherical->projection == 
> AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
> +                    probe_str("projection", "tiled equirectangular");
> +                    probe_object_header("bounding");
> +                    probe_int("left", spherical->left_bound);
> +                    probe_int("top", spherical->top_bound);
> +                    probe_int("right", spherical->right_bound);
> +                    probe_int("bottom", spherical->bottom_bound);
> +                    probe_object_footer("bounding");
> +                } else
>                      probe_str("projection", "unknown");
>  
>                  probe_object_header("orientation");
> diff --git a/doc/APIchanges b/doc/APIchanges
> index c161618..f2b2d0e 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -13,6 +13,11 @@ libavutil:     2015-08-28
>  
>  API changes, most recent first:
>  
> +2017-02-10 - xxxxxxx - lavu 55.31.0 - spherical.h
> +  Add AV_SPHERICAL_EQUIRECTANGULAR_TILE, and projection-specific properties
> +  (left_bound, top_bound, right_bound, bottom_bound, padding) to
> +  AVSphericalMapping.
> +
>  2017-02-01 - xxxxxxx - lavc - avcodec.h
>    Deprecate AVCodecContext.refcounted_frames. This was useful for deprecated
>    API only (avcodec_decode_video2/avcodec_decode_audio4). The new decode APIs
> diff --git a/libavformat/dump.c b/libavformat/dump.c
> index 660df0a..b7ae13d 100644
> --- a/libavformat/dump.c
> +++ b/libavformat/dump.c
> @@ -321,6 +321,8 @@ static void dump_spherical(void *ctx, AVPacketSideData 
> *sd)
>          av_log(ctx, AV_LOG_INFO, "equirectangular ");
>      else if (spherical->projection == AV_SPHERICAL_CUBEMAP)
>          av_log(ctx, AV_LOG_INFO, "cubemap ");
> +    else if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE)
> +        av_log(ctx, AV_LOG_INFO, "tiled equirectangular ");
>      else {
>          av_log(ctx, AV_LOG_WARNING, "unknown");
>          return;
> @@ -330,6 +332,14 @@ static void dump_spherical(void *ctx, AVPacketSideData 
> *sd)
>      pitch = ((double)spherical->pitch) / (1 << 16);
>      roll = ((double)spherical->roll) / (1 << 16);
>      av_log(ctx, AV_LOG_INFO, "(%f/%f/%f) ", yaw, pitch, roll);
> +
> +    if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
> +        av_log(ctx, AV_LOG_INFO, "[%zu, %zu, %zu, %zu] ",
> +               spherical->left_bound, spherical->top_bound,
> +               spherical->right_bound, spherical->bottom_bound);
> +    } else if (spherical->projection == AV_SPHERICAL_CUBEMAP) {
> +        av_log(ctx, AV_LOG_INFO, "[pad %zu] ", spherical->padding);
> +    }
>  }
>  
>  static void dump_sidedata(void *ctx, AVStream *st, const char *indent)
> diff --git a/libavutil/spherical.h b/libavutil/spherical.h
> index 0045eb9..559f7e6 100644
> --- a/libavutil/spherical.h
> +++ b/libavutil/spherical.h
> @@ -63,6 +63,13 @@ enum AVSphericalProjection {
>       * to the back.
>       */
>      AV_SPHERICAL_CUBEMAP,
> +
> +    /**
> +     * Video represents a portion of a sphere mapped on a flat surface
> +     * using equirectangular projection. The @ref bounding fields indicate
> +     * the position of the current video in a larger surface.
> +     */
> +    AV_SPHERICAL_EQUIRECTANGULAR_TILE,
>  };
>  
>  /**
> @@ -122,6 +129,55 @@ typedef struct AVSphericalMapping {
>      /**
>       * @}
>       */
> +
> +    /**
> +     * @name Bounding rectangle
> +     * @anchor bounding
> +     * @{
> +     * These fields indicate the location of the current tile, and where
> +     * it should be mapped relative to the original surface.
> +     *
> +     * @code{.unparsed}
> +     *      +----------------+----------+
> +     *      |                |top_bound |
> +     *      |            +--------+     |
> +     *      | left_bound |tile    |     |
> +     *      +<---------->|        |<--->+right_bound
> +     *      |            +--------+     |
> +     *      |                |          |
> +     *      |    bottom_bound|          |
> +     *      +----------------+----------+
> +     * @endcode
> +     *
> +     * If needed, the original video surface dimensions can be derived
> +     * by adding the current stream or frame size to the related bounds,
> +     * like in the following example:
> +     *
> +     * @code{c}
> +     *     original_width  = tile->width  + left_bound + right_bound;
> +     *     original_height = tile->height + top_bound  + bottom_bound;
> +     * @endcode
> +     *
> +     * @note These values are valid only for the tiled equirectangular
> +     *       projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE),
> +     *       and should be ignored in all other cases.
> +     */
> +    size_t left_bound;   ///< Distance in pixel from the left edge
> +    size_t top_bound;    ///< Distance in pixel from the top edge
> +    size_t right_bound;  ///< Distance in pixel from the right edge
> +    size_t bottom_bound; ///< Distance in pixel from the bottom edge

Nit: I prefer big-endian namespacing, like bound_left etc. By an amazing
coincidence that would also make you consistent with the cropping
rectangle in AVFrame.

Also, "distance in pixel_s_"

> +    /**
> +     * @}
> +     */
> +
> +    /**
> +     * Amount of pixel to pad from the edge of each cube face.

"Number of pixels" sounds more natural to me.

Otherwise looks ok.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to