[vlc-devel] [PATCH 1/6] MP4 rotation, 3rd attempt (bug #2882)
Matthias Keiser
matthias at tristan-inc.com
Sat Mar 1 23:55:08 CET 2014
Am 28.02.2014 um 17:27 schrieb Rémi Denis-Courmont <remi at remlab.net>:
> Le jeudi 27 février 2014, 23:30:13 Matthias Keiser a écrit :
>> This patch is the third attempt to support rotated MP4 movies. The patches
>> of this series supersede all previous patches.
> (...)
>
> While it is always nice to have some context for a patch series, I don't think
> this belongs in the comment logs of the first patch.
>
>>
>> Some previous discussion was here:
>>
>> https://mailman.videolan.org/pipermail/vlc-devel/2014-February/096975.html
>>
>> Some notes:
>>
>> - the transform filter is now inserted into the vd->owner.sys.filter filter
>> chain in the function VoutDisplayCreateRender - in my test no swscale
>> filter was added to the chain except if chroma conversion are necessary -
>> all vout modules that wish to correctly support rotation need to be updated
>> (see [PATCH 6/6] for details)
>>
>> There are still some bugs in vlc which make watching rotated movies not yet
>> optimal:
>>
>> - When VLC wants to create a window for a movie/image, but the window module
>> returns a smaller one than requested (most likely because it was bigger
>> than the screen), the window has the wrong a/r for the picture. This causes
>> black bars to appear. While normally these bars are on the top/bottom and
>> quite small, they are huge for 90/270 rotated movies. - With the macosx
>> vout, when you then try to resize a window, the window suddenly *does* seem
>> to get as big as originally requested, with all controls hidden far below
>> the screen. - When you then try to make the window smaller, you can't make
>> as small as it needs to be again.
>>
>> These bugs are not directly relates to my patch set (I tested it with a
>> appropriately sized png image).
>
> We
>
Did something get lost here?
>>
>> ---
>> include/vlc_es.h | 8 ++++++++
>> src/libvlccore.sym | 1 +
>> src/misc/es_format.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 57 insertions(+)
>>
>> diff --git a/include/vlc_es.h b/include/vlc_es.h
>> index 38d63da..eb52950 100644
>> --- a/include/vlc_es.h
>> +++ b/include/vlc_es.h
>> @@ -153,6 +153,8 @@ typedef enum video_orientation_t
>> ORIENT_RIGHT_BOTTOM, /**< Anti-transposed */
>>
>> ORIENT_NORMAL = ORIENT_TOP_LEFT,
>> + ORIENT_TRANSPOSED = ORIENT_LEFT_TOP,
>> + ORIENT_ANTI_TRANSPOSED = ORIENT_RIGHT_BOTTOM,
>> ORIENT_HFLIPPED = ORIENT_TOP_RIGHT,
>> ORIENT_VFLIPPED = ORIENT_BOTTOM_LEFT,
>> ORIENT_ROTATED_180 = ORIENT_BOTTOM_RIGHT,
>> @@ -265,6 +267,12 @@ VLC_API void video_format_CopyCrop( video_format_t *,
>> const video_format_t * ); VLC_API void video_format_ScaleCropAr(
>> video_format_t *, const video_format_t * );
>>
>> /**
>> + * This function "normalizes" the formats orientation, by switching the a/r
>> according to the orientation, + * producing a format whose orientation is
>> ORIENT_NORMAL. It makes a shallow copy (pallette is not alloc'ed). + */
>> +VLC_API void video_format_ApplyRotation(const video_format_t * restrict in,
>> video_format_t * restrict out); +
>> +/**
>> * This function will check if the first video format is similar
>> * to the second one.
>> */
>> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
>> index 3858e43..3c47d85 100644
>> --- a/src/libvlccore.sym
>> +++ b/src/libvlccore.sym
>> @@ -467,6 +467,7 @@ var_LocationParse
>> video_format_CopyCrop
>> video_format_ScaleCropAr
>> video_format_FixRgb
>> +video_format_ApplyRotation
>> video_format_IsSimilar
>> video_format_Setup
>> video_format_Print
>> diff --git a/src/misc/es_format.c b/src/misc/es_format.c
>> index 8936414..b0b3858 100644
>> --- a/src/misc/es_format.c
>> +++ b/src/misc/es_format.c
>> @@ -244,6 +244,54 @@ void video_format_ScaleCropAr( video_format_t *p_dst,
>> const video_format_t *p_sr p_dst->i_sar_num, p_dst->i_sar_den, 65536);
>> }
>>
>> +void video_format_ApplyRotation(const video_format_t * restrict in,
>> video_format_t * restrict out) { +
>> + *out = *in;
>> +
>> + if(ORIENT_IS_SWAP(in->orientation)) {
>> +
>> + out->i_width = in->i_height;
>> + out->i_visible_width = in->i_visible_height;
>> + out->i_height = in->i_width;
>> + out->i_visible_height = in->i_visible_width;
>> + out->i_sar_num = in->i_sar_den;
>> + out->i_sar_den = in->i_sar_num;
>> + }
>> +
>> + switch (in->orientation) {
>> +
>> + case ORIENT_ROTATED_90:
>> + out->i_x_offset = in->i_height - in->i_visible_height -
>> in->i_y_offset; + out->i_y_offset = in->i_x_offset;
>> + break;
>> + case ORIENT_ROTATED_180:
>> + out->i_x_offset = in->i_width - in->i_visible_width -
>> in->i_x_offset; + out->i_y_offset = in->i_height -
>> in->i_visible_height - in->i_y_offset; + break;
>> + case ORIENT_ROTATED_270:
>> + out->i_x_offset = in->i_y_offset;
>> + out->i_y_offset = in->i_width - in->i_visible_width -
>> in->i_x_offset; + break;
>> + case ORIENT_HFLIPPED:
>> + out->i_x_offset = in->i_width - in->i_visible_width -
>> in->i_x_offset; + break;
>> + case ORIENT_VFLIPPED:
>> + out->i_y_offset = in->i_height - in->i_visible_height -
>> in->i_y_offset; + break;
>> + case ORIENT_TRANSPOSED:
>> + out->i_x_offset = in->i_y_offset;
>> + out->i_y_offset = in->i_x_offset;
>> + break;
>> + case ORIENT_ANTI_TRANSPOSED:
>> + out->i_x_offset = in->i_height - in->i_visible_height -
>> in->i_y_offset; + out->i_y_offset = in->i_width -
>> in->i_visible_width - in->i_x_offset; + break;
>> + }
>> +
>> + out->orientation = ORIENT_NORMAL;
>> +}
>
> Aren't some initializers missing?
I don't think so. I copy the whole format at the beginning of the function.
>
>> +
>> +
>> bool video_format_IsSimilar( const video_format_t *p_fmt1, const
>> video_format_t *p_fmt2 ) {
>> video_format_t v1 = *p_fmt1;
>
> --
> Rémi Denis-Courmont
> http://www.remlab.net/
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list