[vlc-devel] [PATCH 14/28] vlc_es: use vlc_rational_t for the frame rate

Steve Lhomme robux4 at videolabs.io
Fri Mar 31 18:14:29 CEST 2017


---
 include/vlc_es.h                                   |  3 +-
 lib/media.c                                        |  4 +-
 lib/media_player.c                                 |  6 +--
 modules/access/avcapture.m                         |  4 +-
 modules/access/dcp/dcp.cpp                         |  4 +-
 modules/access/decklink.cpp                        |  6 +--
 modules/access/dshow/dshow.cpp                     |  5 +--
 modules/access/imem.c                              |  6 +--
 modules/access/linsys/linsys_hdsdi.c               |  4 +-
 modules/access/linsys/linsys_sdi.c                 |  4 +-
 modules/access/rdp.c                               |  4 +-
 modules/access/screen/mac.c                        |  4 +-
 modules/access/screen/wayland.c                    |  4 +-
 modules/access/screen/xcb.c                        |  4 +-
 modules/access/shm.c                               |  4 +-
 modules/access/v4l2/demux.c                        |  8 ++--
 modules/access/vnc.c                               |  4 +-
 modules/codec/avcodec/d3d11va.c                    |  4 +-
 modules/codec/avcodec/directx_va.c                 |  4 +-
 modules/codec/avcodec/dxva2.c                      |  6 +--
 modules/codec/avcodec/encoder.c                    | 14 +++----
 modules/codec/avcodec/video.c                      | 26 ++++++------
 modules/codec/daala.c                              | 12 +++---
 modules/codec/gstreamer/gstdecode.c                | 14 +++----
 .../codec/gstreamer/gstvlcpictureplaneallocator.c  |  4 +-
 modules/codec/libmpeg2.c                           |  4 +-
 modules/codec/oggspots.c                           |  4 +-
 modules/codec/omxil/omxil.c                        | 12 +++---
 modules/codec/qsv.c                                | 10 ++---
 modules/codec/rawvideo.c                           | 12 +++---
 modules/codec/schroedinger.c                       | 14 +++----
 modules/codec/theora.c                             | 12 +++---
 modules/codec/videotoolbox.m                       |  2 +-
 modules/codec/x264.c                               | 10 ++---
 modules/codec/x265.c                               | 14 +++----
 modules/demux/asf/asf.c                            |  4 +-
 modules/demux/avformat/demux.c                     |  4 +-
 modules/demux/avformat/mux.c                       | 16 ++++----
 modules/demux/avi/avi.c                            |  4 +-
 modules/demux/dirac.c                              |  6 +--
 modules/demux/image.c                              |  6 +--
 modules/demux/mkv/matroska_segment_parse.cpp       |  8 ++--
 modules/demux/mkv/mkv.cpp                          |  4 +-
 modules/demux/mp4/mp4.c                            |  8 ++--
 modules/demux/mpeg/h26x.c                          | 12 +++---
 modules/demux/mpeg/ts_psi.c                        |  4 +-
 modules/demux/ogg.c                                | 36 ++++++++--------
 modules/demux/rawvid.c                             |  8 ++--
 modules/demux/real.c                               |  4 +-
 modules/demux/vc1.c                                |  8 ++--
 modules/hw/mmal/codec.c                            |  4 +-
 modules/hw/mmal/deinterlace.c                      | 12 +++---
 modules/hw/mmal/vout.c                             | 10 ++---
 modules/hw/vdpau/deinterlace.c                     |  8 ++--
 modules/mux/asf.c                                  |  6 +--
 modules/mux/mp4/mp4.c                              | 22 +++++-----
 modules/mux/mpeg/ts.c                              |  8 ++--
 modules/mux/ogg.c                                  | 34 +++++++--------
 modules/packetizer/dirac.c                         |  4 +-
 modules/packetizer/h264.c                          | 16 ++++----
 modules/packetizer/hevc.c                          |  6 +--
 modules/packetizer/mpeg4video.c                    |  8 ++--
 modules/packetizer/mpegvideo.c                     |  8 ++--
 modules/packetizer/vc1.c                           | 10 ++---
 modules/stream_out/transcode/video.c               | 48 +++++++++++-----------
 modules/video_filter/deinterlace/deinterlace.c     |  2 +-
 modules/video_filter/fps.c                         | 20 ++++-----
 modules/video_output/decklink.cpp                  |  6 +--
 modules/video_output/yuv.c                         |  2 +-
 src/input/es_out.c                                 | 18 ++++----
 src/misc/image.c                                   |  4 +-
 71 files changed, 321 insertions(+), 323 deletions(-)

diff --git a/include/vlc_es.h b/include/vlc_es.h
index 462531a4a9..6d7eb58352 100644
--- a/include/vlc_es.h
+++ b/include/vlc_es.h
@@ -321,8 +321,7 @@ struct video_format_t
     unsigned int i_sar_num;                   /**< sample/pixel aspect ratio */
     unsigned int i_sar_den;
 
-    unsigned int i_frame_rate;                     /**< frame rate numerator */
-    unsigned int i_frame_rate_base;              /**< frame rate denominator */
+    vlc_rational_t frame_rate;                               /**< frame rate */
 
     uint32_t i_rmask, i_gmask, i_bmask;      /**< color masks for RGB chroma */
     int i_rrshift, i_lrshift;
diff --git a/lib/media.c b/lib/media.c
index f3be2c93db..9593b6e1a9 100644
--- a/lib/media.c
+++ b/lib/media.c
@@ -1009,8 +1009,8 @@ libvlc_media_tracks_get( libvlc_media_t *p_md, libvlc_media_track_t *** pp_es )
             p_mes->video->i_width = p_es->video.i_visible_width;
             p_mes->video->i_sar_num = p_es->video.i_sar_num;
             p_mes->video->i_sar_den = p_es->video.i_sar_den;
-            p_mes->video->i_frame_rate_num = p_es->video.i_frame_rate;
-            p_mes->video->i_frame_rate_den = p_es->video.i_frame_rate_base;
+            p_mes->video->i_frame_rate_num = p_es->video.frame_rate.num;
+            p_mes->video->i_frame_rate_den = p_es->video.frame_rate.den;
 
             assert( p_es->video.orientation >= ORIENT_TOP_LEFT &&
                     p_es->video.orientation <= ORIENT_RIGHT_BOTTOM );
diff --git a/lib/media_player.c b/lib/media_player.c
index 2c5aa727fb..7cd7bf88f6 100644
--- a/lib/media_player.c
+++ b/lib/media_player.c
@@ -1685,9 +1685,9 @@ float libvlc_media_player_get_fps( libvlc_media_player_t *p_mi )
     {
         const es_format_t *fmt = item->es[i];
 
-        if( fmt->i_cat == VIDEO_ES && fmt->video.i_frame_rate_base > 0 )
-            fps = (float)fmt->video.i_frame_rate
-                  / (float)fmt->video.i_frame_rate_base;
+        if( fmt->i_cat == VIDEO_ES && fmt->video.frame_rate.den > 0 )
+            fps = (float)fmt->video.frame_rate.num
+                  / (float)fmt->video.frame_rate.den;
     }
     vlc_mutex_unlock( &item->lock );
     libvlc_media_release( media );
diff --git a/modules/access/avcapture.m b/modules/access/avcapture.m
index 7d3267b86d..05f22c3312 100644
--- a/modules/access/avcapture.m
+++ b/modules/access/avcapture.m
@@ -417,8 +417,8 @@ static int Demux(demux_t *p_demux)
             }
             else if ( !p_sys->b_es_setup )
             {
-                p_sys->fmt.video.i_frame_rate_base = [(__bridge VLCAVDecompressedVideoOutput *)p_sys->output timeScale];
-                msg_Dbg(p_demux, "using frame rate base: %i", p_sys->fmt.video.i_frame_rate_base);
+                p_sys->fmt.video.frame_rate.den = [(__bridge VLCAVDecompressedVideoOutput *)p_sys->output timeScale];
+                msg_Dbg(p_demux, "using frame rate base: %i", p_sys->fmt.video.frame_rate.den);
                 p_sys->width = p_sys->fmt.video.i_width = [(__bridge VLCAVDecompressedVideoOutput *)p_sys->output width];
                 p_sys->height = p_sys->fmt.video.i_height = [(__bridge VLCAVDecompressedVideoOutput *)p_sys->output height];
                 p_sys->p_es_video = es_out_Add(p_demux->out, &p_sys->fmt);
diff --git a/modules/access/dcp/dcp.cpp b/modules/access/dcp/dcp.cpp
index fbe7f8f66c..1437ee36c4 100644
--- a/modules/access/dcp/dcp.cpp
+++ b/modules/access/dcp/dcp.cpp
@@ -863,8 +863,8 @@ static inline void fillVideoFmt( video_format_t * fmt, unsigned int width, unsig
     fmt->i_height = height;
     /* As input are square pixels let VLC  or decoder fix SAR, origin,
      * and visible area */
-    fmt->i_frame_rate = frame_rate_num;
-    fmt->i_frame_rate_base = frame_rate_denom;
+    fmt->frame_rate.num = frame_rate_num;
+    fmt->frame_rate.den = frame_rate_denom;
 }
 
 /**
diff --git a/modules/access/decklink.cpp b/modules/access/decklink.cpp
index 248009ed15..175bab14bd 100644
--- a/modules/access/decklink.cpp
+++ b/modules/access/decklink.cpp
@@ -192,9 +192,9 @@ static es_format_t GetModeSettings(demux_t *demux, IDeckLinkDisplayMode *m)
     video_fmt.video.i_height = m->GetHeight();
     video_fmt.video.i_sar_num = 1;
     video_fmt.video.i_sar_den = 1;
-    video_fmt.video.i_frame_rate = time_scale;
-    video_fmt.video.i_frame_rate_base = frame_duration;
-    video_fmt.i_bitrate = video_fmt.video.i_width * video_fmt.video.i_height * video_fmt.video.i_frame_rate * 2 * 8;
+    video_fmt.video.frame_rate.num = time_scale;
+    video_fmt.video.frame_rate.den = frame_duration;
+    video_fmt.i_bitrate = video_fmt.video.i_width * video_fmt.video.i_height * video_fmt.video.frame_rate.num * 2 * 8;
 
     vlc_rational_t aspect;
     if (!var_InheritURational(demux, &aspect, "decklink-aspect-ratio") &&
diff --git a/modules/access/dshow/dshow.cpp b/modules/access/dshow/dshow.cpp
index dbd0f0345e..3ec963a7d6 100644
--- a/modules/access/dshow/dshow.cpp
+++ b/modules/access/dshow/dshow.cpp
@@ -733,9 +733,8 @@ static int DemuxOpen( vlc_object_t *p_this )
 
             if( p_stream->header.video.AvgTimePerFrame )
             {
-                fmt.video.i_frame_rate = 10000000;
-                fmt.video.i_frame_rate_base =
-                    p_stream->header.video.AvgTimePerFrame;
+                fmt.video.frame_rate.num = 10000000;
+                fmt.video.frame_rate.den = p_stream->header.video.AvgTimePerFrame;
             }
         }
         else if( p_stream->mt.majortype == MEDIATYPE_Audio )
diff --git a/modules/access/imem.c b/modules/access/imem.c
index e6974e1182..5116dac208 100644
--- a/modules/access/imem.c
+++ b/modules/access/imem.c
@@ -438,15 +438,15 @@ static int OpenDemux(vlc_object_t *object)
             }
         }
         if (!var_InheritURational(object, &rat, "imem-fps") && rat.num && rat.den) {
-            fmt.video.i_frame_rate      = rat.num;
-            fmt.video.i_frame_rate_base = rat.den;
+            fmt.video.frame_rate.num = rat.num;
+            fmt.video.frame_rate.den = rat.den;
         }
 
         msg_Dbg(object, "Video %4.4s %dx%d  SAR %d:%d frame rate %u/%u",
                 (const char *)&fmt.i_codec,
                 fmt.video.i_width, fmt.video.i_height,
                 fmt.video.i_sar_num, fmt.video.i_sar_den,
-                fmt.video.i_frame_rate, fmt.video.i_frame_rate_base);
+                fmt.video.frame_rate.num, fmt.video.frame_rate.den);
         break;
     }
     case 3: {
diff --git a/modules/access/linsys/linsys_hdsdi.c b/modules/access/linsys/linsys_hdsdi.c
index b1bc1f4670..2b4e31b0b0 100644
--- a/modules/access/linsys/linsys_hdsdi.c
+++ b/modules/access/linsys/linsys_hdsdi.c
@@ -508,8 +508,8 @@ static int InitVideo( demux_t *p_demux )
     /* Video ES */
     es_format_Init( &fmt, VIDEO_ES, VLC_FOURCC('I','4','2','0') );
     fmt.i_id                    = p_sys->i_id_video;
-    fmt.video.i_frame_rate      = p_sys->i_frame_rate.num;
-    fmt.video.i_frame_rate_base = p_sys->i_frame_rate.den;
+    fmt.video.frame_rate.num    = p_sys->frame_rate.num;
+    fmt.video.frame_rate.den    = p_sys->frame_rate.den;
     fmt.video.i_width           = fmt.video.i_visible_width = p_sys->i_width;
     fmt.video.i_height          = fmt.video.i_visible_height = p_sys->i_height;
     fmt.video.i_sar_num         = p_sys->i_aspect * fmt.video.i_height
diff --git a/modules/access/linsys/linsys_sdi.c b/modules/access/linsys/linsys_sdi.c
index 2790186aa2..6a07b156ad 100644
--- a/modules/access/linsys/linsys_sdi.c
+++ b/modules/access/linsys/linsys_sdi.c
@@ -442,8 +442,8 @@ static int StartDecode( demux_t *p_demux )
     /* Video ES */
     es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_I420 );
     fmt.i_id                    = p_sys->i_id_video;
-    fmt.video.i_frame_rate      = p_sys->frame_rate.num;
-    fmt.video.i_frame_rate_base = p_sys->frame_rate.den;
+    fmt.video.frame_rate.num    = p_sys->frame_rate.num;
+    fmt.video.frame_rate.den    = p_sys->frame_rate.den;
     fmt.video.i_width           = p_sys->i_width;
     fmt.video.i_height          = p_sys->i_height;
     int i_aspect = p_sys->i_forced_aspect ? p_sys->i_forced_aspect
diff --git a/modules/access/rdp.c b/modules/access/rdp.c
index c9bcd6f3b0..cab7cdd61e 100644
--- a/modules/access/rdp.c
+++ b/modules/access/rdp.c
@@ -174,8 +174,8 @@ static void desktopResizeHandler( rdpContext *p_context )
     fmt.video.i_width = p_gdi->width;
     fmt.video.i_visible_height =
     fmt.video.i_height = p_gdi->height;
-    fmt.video.i_frame_rate_base = 1000;
-    fmt.video.i_frame_rate = 1000 * p_sys->f_fps;
+    fmt.video.frame_rate.den = 1000;
+    fmt.video.frame_rate.num = 1000 * p_sys->f_fps;
     p_sys->i_framebuffersize = p_gdi->width * p_gdi->height * p_gdi->bytesPerPixel;
 
     if ( p_sys->p_block )
diff --git a/modules/access/screen/mac.c b/modules/access/screen/mac.c
index ae8a67fd82..e9ae7bcf76 100644
--- a/modules/access/screen/mac.c
+++ b/modules/access/screen/mac.c
@@ -126,8 +126,8 @@ int screen_InitCapture(demux_t *p_demux)
     p_sys->fmt.video.i_bmask           = 0x000000ff;
     p_sys->fmt.video.i_sar_num         =
     p_sys->fmt.video.i_sar_den         = 1;
-    p_sys->fmt.video.i_frame_rate      = 1000 * p_data->rate;
-    p_sys->fmt.video.i_frame_rate_base = 1000;
+    p_sys->fmt.video.frame_rate.num    = 1000 * p_data->rate;
+    p_sys->fmt.video.frame_rate.den    = 1000;
 
     return VLC_SUCCESS;
 }
diff --git a/modules/access/screen/wayland.c b/modules/access/screen/wayland.c
index f6b300da20..5b9cf2f133 100644
--- a/modules/access/screen/wayland.c
+++ b/modules/access/screen/wayland.c
@@ -124,8 +124,8 @@ static void output_mode_cb(void *data, struct wl_output *output,
     fmt.video.i_chroma = VLC_CODEC_RGB32;
     fmt.video.i_bits_per_pixel = 32;
     fmt.video.i_sar_num = fmt.video.i_sar_den = 1;
-    fmt.video.i_frame_rate = lroundf(1000.f * sys->rate);
-    fmt.video.i_frame_rate_base = 1000;
+    fmt.video.frame_rate.num = lroundf(1000.f * sys->rate);
+    fmt.video.frame_rate.den = 1000;
     fmt.video.i_width = width;
 
     if (sys->w != 0 && width > sys->w + sys->x)
diff --git a/modules/access/screen/xcb.c b/modules/access/screen/xcb.c
index bfdfacf055..7a69cfebfe 100644
--- a/modules/access/screen/xcb.c
+++ b/modules/access/screen/xcb.c
@@ -567,8 +567,8 @@ static es_out_id_t *InitES (demux_t *demux, uint_fast16_t width,
     fmt.video.i_chroma = chroma;
     fmt.video.i_bits_per_pixel = *bpp;
     fmt.video.i_sar_num = fmt.video.i_sar_den = 1;
-    fmt.video.i_frame_rate = 1000 * p_sys->rate;
-    fmt.video.i_frame_rate_base = 1000;
+    fmt.video.frame_rate.num = 1000 * p_sys->rate;
+    fmt.video.frame_rate.den = 1000;
     fmt.video.i_visible_width = fmt.video.i_width = width;
     fmt.video.i_visible_height = fmt.video.i_height = height;
 
diff --git a/modules/access/shm.c b/modules/access/shm.c
index 0d9369efe9..69f741035b 100644
--- a/modules/access/shm.c
+++ b/modules/access/shm.c
@@ -232,8 +232,8 @@ static int Open (vlc_object_t *obj)
     fmt.video.i_chroma = chroma;
     fmt.video.i_bits_per_pixel = bpp;
     fmt.video.i_sar_num = fmt.video.i_sar_den = 1;
-    fmt.video.i_frame_rate = 1000 * rate;
-    fmt.video.i_frame_rate_base = 1000;
+    fmt.video.frame_rate.num = 1000 * rate;
+    fmt.video.frame_rate.den = 1000;
     fmt.video.i_visible_width = fmt.video.i_width = width;
     fmt.video.i_visible_height = fmt.video.i_height = height;
 
diff --git a/modules/access/v4l2/demux.c b/modules/access/v4l2/demux.c
index e56714cc7a..37db002770 100644
--- a/modules/access/v4l2/demux.c
+++ b/modules/access/v4l2/demux.c
@@ -400,8 +400,8 @@ static int InitVideo (demux_t *demux, int fd, uint32_t caps)
         es_fmt.video.i_width = fmt.fmt.pix.width;
     es_fmt.video.i_visible_height =
     es_fmt.video.i_height = fmt.fmt.pix.height;
-    es_fmt.video.i_frame_rate = parm.parm.capture.timeperframe.denominator;
-    es_fmt.video.i_frame_rate_base = parm.parm.capture.timeperframe.numerator;
+    es_fmt.video.frame_rate.num = parm.parm.capture.timeperframe.denominator;
+    es_fmt.video.frame_rate.den = parm.parm.capture.timeperframe.numerator;
     GetAR (fd, &es_fmt.video.i_sar_num, &es_fmt.video.i_sar_den);
 
     msg_Dbg (demux, "color primaries: %u", fmt.fmt.pix.colorspace);
@@ -542,8 +542,8 @@ static int InitVideo (demux_t *demux, int fd, uint32_t caps)
              (char *)&es_fmt.i_codec,
              es_fmt.video.i_visible_width, es_fmt.video.i_visible_height,
              es_fmt.video.i_width, es_fmt.video.i_height);
-    msg_Dbg (demux, " frame rate: %u/%u", es_fmt.video.i_frame_rate,
-             es_fmt.video.i_frame_rate_base);
+    msg_Dbg (demux, " frame rate: %u/%u", es_fmt.video.frame_rate.num,
+             es_fmt.video.frame_rate.den);
     msg_Dbg (demux, " aspect ratio: %u/%u", es_fmt.video.i_sar_num,
              es_fmt.video.i_sar_den);
     sys->es = es_out_Add (demux->out, &es_fmt);
diff --git a/modules/access/vnc.c b/modules/access/vnc.c
index c8eca5b166..d5a88506ae 100644
--- a/modules/access/vnc.c
+++ b/modules/access/vnc.c
@@ -208,8 +208,8 @@ static rfbBool mallocFrameBufferHandler( rfbClient* p_client )
     fmt.video.i_visible_height =
             fmt.video.i_height = i_height;
 
-    fmt.video.i_frame_rate_base = 1000;
-    fmt.video.i_frame_rate = 1000 * p_sys->f_fps;
+    fmt.video.frame_rate.den = 1000;
+    fmt.video.frame_rate.num = 1000 * p_sys->f_fps;
 
     fmt.video.i_bits_per_pixel = i_depth;
     fmt.video.i_rmask = p_client->format.redMax << p_client->format.redShift;
diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index 6cdd166a2f..c3da9ab7b9 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -795,8 +795,8 @@ static bool SetupProcessor(vlc_va_t *va, const video_format_t *fmt)
     D3D11_VIDEO_PROCESSOR_CONTENT_DESC processorDesc = {
         .InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE,   /* TODO */
         .InputFrameRate = {
-            .Numerator   = fmt->i_frame_rate_base > 0 ? fmt->i_frame_rate : 0,
-            .Denominator = fmt->i_frame_rate_base,
+            .Numerator   = fmt->frame_rate.den > 0 ? fmt->frame_rate.num : 0,
+            .Denominator = fmt->frame_rate.den,
         },
         .InputWidth   = fmt->i_width,
         .InputHeight  = fmt->i_height,
diff --git a/modules/codec/avcodec/directx_va.c b/modules/codec/avcodec/directx_va.c
index 1c26edcd6e..47f9c03408 100644
--- a/modules/codec/avcodec/directx_va.c
+++ b/modules/codec/avcodec/directx_va.c
@@ -329,8 +329,8 @@ int directx_va_Setup(vlc_va_t *va, directx_sys_t *dx_sys, AVCodecContext *avctx)
     memset(&fmt, 0, sizeof(fmt));
     fmt.i_width = dx_sys->width;
     fmt.i_height = dx_sys->height;
-    fmt.i_frame_rate = avctx->framerate.num;
-    fmt.i_frame_rate_base = avctx->framerate.den;
+    fmt.frame_rate.num = avctx->framerate.num;
+    fmt.frame_rate.den = avctx->framerate.den;
 
     if (dx_sys->pf_create_decoder_surfaces(va, dx_sys->codec_id, &fmt))
         return VLC_EGENERIC;
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index f2ff49777e..2399677b5e 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -759,9 +759,9 @@ static int DxCreateVideoDecoder(vlc_va_t *va, int codec_id, const video_format_t
     dsc.SampleWidth     = fmt->i_width;
     dsc.SampleHeight    = fmt->i_height;
     dsc.Format          = p_sys->render;
-    if (fmt->i_frame_rate > 0 && fmt->i_frame_rate_base > 0) {
-        dsc.InputSampleFreq.Numerator   = fmt->i_frame_rate;
-        dsc.InputSampleFreq.Denominator = fmt->i_frame_rate_base;
+    if (fmt->frame_rate.num > 0 && fmt->frame_rate.den > 0) {
+        dsc.InputSampleFreq.Numerator   = fmt->frame_rate.num;
+        dsc.InputSampleFreq.Denominator = fmt->frame_rate.den;
     } else {
         dsc.InputSampleFreq.Numerator   = 0;
         dsc.InputSampleFreq.Denominator = 0;
diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
index 2514ef9055..ffd88bdba5 100644
--- a/modules/codec/avcodec/encoder.c
+++ b/modules/codec/avcodec/encoder.c
@@ -240,12 +240,12 @@ static const int DEFAULT_ALIGN = 0;
  *****************************************************************************/
 static void probe_video_frame_rate( encoder_t *p_enc, AVCodecContext *p_context, AVCodec *p_codec )
 {
-    /* if we don't have i_frame_rate_base, we are probing and just checking if we can find codec
+    /* if we don't have frame_rate.den, we are probing and just checking if we can find codec
      * so set fps to requested fps if asked by user or input fps is availabled */
-    p_context->time_base.num = p_enc->fmt_in.video.i_frame_rate_base ? p_enc->fmt_in.video.i_frame_rate_base : 1;
+    p_context->time_base.num = p_enc->fmt_in.video.frame_rate.den ? p_enc->fmt_in.video.frame_rate.den : 1;
 
     // MP4V doesn't like CLOCK_FREQ denominator in time_base, so use 1/25 as default for that
-    p_context->time_base.den = p_enc->fmt_in.video.i_frame_rate_base ? p_enc->fmt_in.video.i_frame_rate :
+    p_context->time_base.den = p_enc->fmt_in.video.frame_rate.den ? p_enc->fmt_in.video.frame_rate.num :
                                   ( p_enc->fmt_out.i_codec == VLC_CODEC_MP4V ? 25 : CLOCK_FREQ );
 
     msg_Dbg( p_enc, "Time base for probing set to %d/%d", p_context->time_base.num, p_context->time_base.den );
@@ -263,11 +263,11 @@ static void probe_video_frame_rate( encoder_t *p_enc, AVCodecContext *p_context,
         /* If we have something reasonable on supported framerates, use that*/
         if( p_context->time_base.den && p_context->time_base.den < CLOCK_FREQ )
         {
-            p_enc->fmt_out.video.i_frame_rate_base =
-                p_enc->fmt_in.video.i_frame_rate_base =
+            p_enc->fmt_out.video.frame_rate.den =
+                p_enc->fmt_in.video.frame_rate.den =
                 p_context->time_base.num;
-            p_enc->fmt_out.video.i_frame_rate =
-                p_enc->fmt_in.video.i_frame_rate =
+            p_enc->fmt_out.video.frame_rate.num =
+                p_enc->fmt_in.video.frame_rate.num =
                 p_context->time_base.den;
         }
     }
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index f9b982bc33..715a86f530 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -173,25 +173,25 @@ static int lavc_GetVideoFormat(decoder_t *dec, video_format_t *restrict fmt,
             fmt->i_sar_num = fmt->i_sar_den = 1;
     }
 
-    if (dec->fmt_in.video.i_frame_rate > 0
-     && dec->fmt_in.video.i_frame_rate_base > 0)
+    if (dec->fmt_in.video.frame_rate.num > 0
+     && dec->fmt_in.video.frame_rate.den > 0)
     {
-        fmt->i_frame_rate = dec->fmt_in.video.i_frame_rate;
-        fmt->i_frame_rate_base = dec->fmt_in.video.i_frame_rate_base;
+        fmt->frame_rate.num = dec->fmt_in.video.frame_rate.num;
+        fmt->frame_rate.den = dec->fmt_in.video.frame_rate.den;
     }
     else if (ctx->framerate.num > 0 && ctx->framerate.den > 0)
     {
-        fmt->i_frame_rate = ctx->framerate.num;
-        fmt->i_frame_rate_base = ctx->framerate.den;
+        fmt->frame_rate.num = ctx->framerate.num;
+        fmt->frame_rate.den = ctx->framerate.den;
 # if LIBAVCODEC_VERSION_MICRO <  100
         // for some reason libav don't thinkg framerate presents actually same thing as in ffmpeg
-        fmt->i_frame_rate_base *= __MAX(ctx->ticks_per_frame, 1);
+        fmt->frame_rate.den *= __MAX(ctx->ticks_per_frame, 1);
 # endif
     }
     else if (ctx->time_base.num > 0 && ctx->time_base.den > 0)
     {
-        fmt->i_frame_rate = ctx->time_base.den;
-        fmt->i_frame_rate_base = ctx->time_base.num
+        fmt->frame_rate.num = ctx->time_base.den;
+        fmt->frame_rate.den = ctx->time_base.num
                                  * __MAX(ctx->ticks_per_frame, 1);
     }
 
@@ -681,12 +681,12 @@ static void interpolate_next_pts( decoder_t *p_dec, AVFrame *frame )
         return;
 
     /* interpolate the next PTS */
-    if( p_dec->fmt_in.video.i_frame_rate > 0 &&
-        p_dec->fmt_in.video.i_frame_rate_base > 0 )
+    if( p_dec->fmt_in.video.frame_rate.num > 0 &&
+        p_dec->fmt_in.video.frame_rate.den > 0 )
     {
         p_sys->i_pts += CLOCK_FREQ * (2 + frame->repeat_pict) *
-            p_dec->fmt_in.video.i_frame_rate_base /
-            (2 * p_dec->fmt_in.video.i_frame_rate);
+            p_dec->fmt_in.video.frame_rate.den /
+            (2 * p_dec->fmt_in.video.frame_rate.num);
     }
     else if( p_context->time_base.den > 0 )
     {
diff --git a/modules/codec/daala.c b/modules/codec/daala.c
index ca94b67107..15b487423b 100644
--- a/modules/codec/daala.c
+++ b/modules/codec/daala.c
@@ -346,8 +346,8 @@ static int ProcessHeaders( decoder_t *p_dec )
 
     if( p_sys->di.timebase_numerator > 0 && p_sys->di.timebase_denominator > 0 )
     {
-        p_dec->fmt_out.video.i_frame_rate = p_sys->di.timebase_numerator;
-        p_dec->fmt_out.video.i_frame_rate_base = p_sys->di.timebase_denominator;
+        p_dec->fmt_out.video.frame_rate.num = p_sys->di.timebase_numerator;
+        p_dec->fmt_out.video.frame_rate.den = p_sys->di.timebase_denominator;
     }
 
     msg_Dbg( p_dec, "%dx%d %.02f fps video, frame content ",
@@ -656,16 +656,16 @@ static int OpenEncoder( vlc_object_t *p_this )
     }
     p_sys->di.frame_duration = 1;
 
-    if( !p_enc->fmt_in.video.i_frame_rate ||
-        !p_enc->fmt_in.video.i_frame_rate_base )
+    if( !p_enc->fmt_in.video.frame_rate.num ||
+        !p_enc->fmt_in.video.frame_rate.den )
     {
         p_sys->di.timebase_numerator = 25;
         p_sys->di.timebase_denominator = 1;
     }
     else
     {
-        p_sys->di.timebase_numerator = p_enc->fmt_in.video.i_frame_rate;
-        p_sys->di.timebase_denominator = p_enc->fmt_in.video.i_frame_rate_base;
+        p_sys->di.timebase_numerator = p_enc->fmt_in.video.frame_rate.num;
+        p_sys->di.timebase_denominator = p_enc->fmt_in.video.frame_rate.den;
     }
 
     if( p_enc->fmt_in.video.i_sar_num > 0 && p_enc->fmt_in.video.i_sar_den > 0 )
diff --git a/modules/codec/gstreamer/gstdecode.c b/modules/codec/gstreamer/gstdecode.c
index dbaddcee41..d6e86844db 100644
--- a/modules/codec/gstreamer/gstdecode.c
+++ b/modules/codec/gstreamer/gstdecode.c
@@ -404,10 +404,10 @@ static GstStructure* vlc_to_gst_fmt( const es_format_t *p_fmt )
                 "width", G_TYPE_INT, p_vfmt->i_width,
                 "height", G_TYPE_INT, p_vfmt->i_height, NULL );
 
-    if( p_vfmt->i_frame_rate && p_vfmt->i_frame_rate_base )
+    if( p_vfmt->frame_rate.num && p_vfmt->frame_rate.den )
         gst_structure_set( p_str, "framerate", GST_TYPE_FRACTION,
-                p_vfmt->i_frame_rate,
-                p_vfmt->i_frame_rate_base, NULL );
+                p_vfmt->frame_rate.num,
+                p_vfmt->frame_rate.den, NULL );
 
     if( p_vfmt->i_sar_num && p_vfmt->i_sar_den )
         gst_structure_set( p_str, "pixel-aspect-ratio", GST_TYPE_FRACTION,
@@ -698,11 +698,11 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
             GST_BUFFER_DURATION( p_buf ) = gst_util_uint64_scale(
                     p_block->i_length, GST_SECOND, GST_MSECOND );
 
-        if( p_dec->fmt_in.video.i_frame_rate  &&
-                p_dec->fmt_in.video.i_frame_rate_base )
+        if( p_dec->fmt_in.video.frame_rate.num  &&
+                p_dec->fmt_in.video.frame_rate.den )
             GST_BUFFER_DURATION( p_buf ) = gst_util_uint64_scale( GST_SECOND,
-                    p_dec->fmt_in.video.i_frame_rate_base,
-                    p_dec->fmt_in.video.i_frame_rate );
+                    p_dec->fmt_in.video.frame_rate.den,
+                    p_dec->fmt_in.video.frame_rate.num );
 
         /* Give the input buffer to GStreamer Bin.
          *
diff --git a/modules/codec/gstreamer/gstvlcpictureplaneallocator.c b/modules/codec/gstreamer/gstvlcpictureplaneallocator.c
index 2029eb47a4..6282b8dc7f 100644
--- a/modules/codec/gstreamer/gstvlcpictureplaneallocator.c
+++ b/modules/codec/gstreamer/gstvlcpictureplaneallocator.c
@@ -243,8 +243,8 @@ bool gst_vlc_set_vout_fmt( GstVideoInfo *p_info, GstVideoAlignment *p_align,
     p_voutfmt->i_x_offset = p_align->padding_left;
     p_voutfmt->i_y_offset = p_align->padding_top;
 
-    p_voutfmt->i_frame_rate = GST_VIDEO_INFO_FPS_N( p_info );
-    p_voutfmt->i_frame_rate_base = GST_VIDEO_INFO_FPS_D( p_info );
+    p_voutfmt->frame_rate.num = GST_VIDEO_INFO_FPS_N( p_info );
+    p_voutfmt->frame_rate.den = GST_VIDEO_INFO_FPS_D( p_info );
 
     return true;
 }
diff --git a/modules/codec/libmpeg2.c b/modules/codec/libmpeg2.c
index 1f128995c4..1d99ad03c5 100644
--- a/modules/codec/libmpeg2.c
+++ b/modules/codec/libmpeg2.c
@@ -677,10 +677,10 @@ static picture_t *GetNewPicture( decoder_t *p_dec )
 
     if( p_sys->p_info->sequence->frame_period > 0 )
     {
-        p_dec->fmt_out.video.i_frame_rate =
+        p_dec->fmt_out.video.frame_rate.num =
             (uint32_t)( (uint64_t)1001000000 * 27 /
                         p_sys->p_info->sequence->frame_period );
-        p_dec->fmt_out.video.i_frame_rate_base = 1001;
+        p_dec->fmt_out.video.frame_rate.den = 1001;
     }
 
     p_dec->fmt_out.i_codec =
diff --git a/modules/codec/oggspots.c b/modules/codec/oggspots.c
index 9db89c40e3..213c46a054 100644
--- a/modules/codec/oggspots.c
+++ b/modules/codec/oggspots.c
@@ -238,8 +238,8 @@ static int ProcessHeader(decoder_t* p_dec)
     }
 
     /* Normalize granulerate */
-    vlc_ureduce(&p_dec->fmt_in.video.i_frame_rate,
-                &p_dec->fmt_in.video.i_frame_rate_base,
+    vlc_ureduce(&p_dec->fmt_in.video.frame_rate.num,
+                &p_dec->fmt_in.video.frame_rate.den,
                 i_granulerate_numerator, i_granulerate_denominator, 0);
 
     /* Image format */
diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c
index 2ae9bb1874..ba52fdca53 100644
--- a/modules/codec/omxil/omxil.c
+++ b/modules/codec/omxil/omxil.c
@@ -262,10 +262,10 @@ static OMX_ERRORTYPE SetPortDefinition(decoder_t *p_dec, OmxPort *p_port,
         def->format.video.nFrameHeight = p_fmt->video.i_height;
         if(def->format.video.eCompressionFormat == OMX_VIDEO_CodingUnused)
             def->format.video.nStride = def->format.video.nFrameWidth;
-        if( p_fmt->video.i_frame_rate > 0 &&
-            p_fmt->video.i_frame_rate_base > 0 )
-            def->format.video.xFramerate = (p_fmt->video.i_frame_rate << 16) /
-                p_fmt->video.i_frame_rate_base;
+        if( p_fmt->video.frame_rate.num > 0 &&
+            p_fmt->video.frame_rate.den > 0 )
+            def->format.video.xFramerate = (p_fmt->video.frame_rate.num << 16) /
+                p_fmt->video.frame_rate.den;
 
         if(def->eDir == OMX_DirInput || p_dec->p_sys->b_enc)
         {
@@ -595,8 +595,8 @@ static OMX_ERRORTYPE GetPortDefinition(decoder_t *p_dec, OmxPort *p_port,
         p_fmt->video.i_visible_width = def->format.video.nFrameWidth;
         p_fmt->video.i_height = def->format.video.nFrameHeight;
         p_fmt->video.i_visible_height = def->format.video.nFrameHeight;
-        p_fmt->video.i_frame_rate = p_dec->fmt_in.video.i_frame_rate;
-        p_fmt->video.i_frame_rate_base = p_dec->fmt_in.video.i_frame_rate_base;
+        p_fmt->video.frame_rate.num = p_dec->fmt_in.video.frame_rate.num;
+        p_fmt->video.frame_rate.den = p_dec->fmt_in.video.frame_rate.den;
 
         OMX_INIT_STRUCTURE(crop_rect);
         crop_rect.nPortIndex = def->nPortIndex;
diff --git a/modules/codec/qsv.c b/modules/codec/qsv.c
index e0c9121fc4..f85750b045 100644
--- a/modules/codec/qsv.c
+++ b/modules/codec/qsv.c
@@ -414,7 +414,7 @@ static int Open(vlc_object_t *this)
         return VLC_EGENERIC;
 
     if (!enc->fmt_in.video.i_visible_height || !enc->fmt_in.video.i_visible_width ||
-        !enc->fmt_in.video.i_frame_rate || !enc->fmt_in.video.i_frame_rate_base) {
+        !enc->fmt_in.video.frame_rate.num || !enc->fmt_in.video.frame_rate.den) {
         msg_Err(enc, "Framerate and picture dimensions must be non-zero");
         return VLC_EGENERIC;
     }
@@ -452,8 +452,8 @@ static int Open(vlc_object_t *this)
     enc->fmt_in.video.i_bits_per_pixel = 12;
 
     /* Input picture format description */
-    sys->params.mfx.FrameInfo.FrameRateExtN = enc->fmt_in.video.i_frame_rate;
-    sys->params.mfx.FrameInfo.FrameRateExtD = enc->fmt_in.video.i_frame_rate_base;
+    sys->params.mfx.FrameInfo.FrameRateExtN = enc->fmt_in.video.frame_rate.num;
+    sys->params.mfx.FrameInfo.FrameRateExtD = enc->fmt_in.video.frame_rate.den;
     sys->params.mfx.FrameInfo.FourCC        = MFX_FOURCC_NV12;
     sys->params.mfx.FrameInfo.ChromaFormat  = MFX_CHROMAFORMAT_YUV420;
     sys->params.mfx.FrameInfo.Width         = QSV_ALIGN(16, enc->fmt_in.video.i_width);
@@ -698,8 +698,8 @@ static block_t *Encode(encoder_t *this, picture_t *pic)
 
             /* Copied from x264.c: This isn't really valid for streams with B-frames */
             block->i_length = CLOCK_FREQ *
-                enc->fmt_in.video.i_frame_rate_base /
-                enc->fmt_in.video.i_frame_rate;
+                enc->fmt_in.video.frame_rate.den /
+                enc->fmt_in.video.frame_rate.num;
 
             // Buggy DTS (value comes from experiments)
             if (task->bs.DecodeTimeStamp < -10000)
diff --git a/modules/codec/rawvideo.c b/modules/codec/rawvideo.c
index 7500d7afb4..1711be13e3 100644
--- a/modules/codec/rawvideo.c
+++ b/modules/codec/rawvideo.c
@@ -102,14 +102,14 @@ static int OpenCommon( decoder_t *p_dec )
 
     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
 
-    date_Init( &p_sys->pts, p_dec->fmt_out.video.i_frame_rate,
-               p_dec->fmt_out.video.i_frame_rate_base );
-    if( p_dec->fmt_out.video.i_frame_rate == 0 ||
-        p_dec->fmt_out.video.i_frame_rate_base == 0)
+    date_Init( &p_sys->pts, p_dec->fmt_out.video.frame_rate.num,
+               p_dec->fmt_out.video.frame_rate.den );
+    if( p_dec->fmt_out.video.frame_rate.num == 0 ||
+        p_dec->fmt_out.video.frame_rate.den == 0)
     {
         msg_Warn( p_dec, "invalid frame rate %d/%d, using 25 fps instead",
-                  p_dec->fmt_out.video.i_frame_rate,
-                  p_dec->fmt_out.video.i_frame_rate_base);
+                  p_dec->fmt_out.video.frame_rate.num,
+                  p_dec->fmt_out.video.frame_rate.den);
         date_Init( &p_sys->pts, 25, 1 );
     }
 
diff --git a/modules/codec/schroedinger.c b/modules/codec/schroedinger.c
index e83240fbf8..a14d3915d9 100644
--- a/modules/codec/schroedinger.c
+++ b/modules/codec/schroedinger.c
@@ -630,9 +630,9 @@ static void SetVideoFormat( decoder_t *p_dec )
     p_dec->fmt_out.video.i_sar_num = p_sys->p_format->aspect_ratio_numerator;
     p_dec->fmt_out.video.i_sar_den = p_sys->p_format->aspect_ratio_denominator;
 
-    p_dec->fmt_out.video.i_frame_rate =
+    p_dec->fmt_out.video.frame_rate.num =
         p_sys->p_format->frame_rate_numerator;
-    p_dec->fmt_out.video.i_frame_rate_base =
+    p_dec->fmt_out.video.frame_rate.den =
         p_sys->p_format->frame_rate_denominator;
 }
 
@@ -1081,7 +1081,7 @@ static int OpenEncoder( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    if( !p_enc->fmt_in.video.i_frame_rate || !p_enc->fmt_in.video.i_frame_rate_base ||
+    if( !p_enc->fmt_in.video.frame_rate.num || !p_enc->fmt_in.video.frame_rate.den ||
         !p_enc->fmt_in.video.i_visible_height || !p_enc->fmt_in.video.i_visible_width )
     {
         msg_Err( p_enc, "Framerate and picture dimensions must be non-zero" );
@@ -1121,7 +1121,7 @@ static int OpenEncoder( vlc_object_t *p_this )
         }
         if( schro_format_guess[i].i_height != p_enc->fmt_in.video.i_height )
             continue;
-        int src_fps = p_enc->fmt_in.video.i_frame_rate / p_enc->fmt_in.video.i_frame_rate_base;
+        int src_fps = p_enc->fmt_in.video.frame_rate.num / p_enc->fmt_in.video.frame_rate.den;
         int delta_fps = abs( schro_format_guess[i].i_approx_fps - src_fps );
         if( delta_fps > 2 )
             continue;
@@ -1150,8 +1150,8 @@ static int OpenEncoder( vlc_object_t *p_this )
     /* constants set from the input video format */
     p_sys->p_format->width                  = p_enc->fmt_in.video.i_visible_width;
     p_sys->p_format->height                 = p_enc->fmt_in.video.i_visible_height;
-    p_sys->p_format->frame_rate_numerator   = p_enc->fmt_in.video.i_frame_rate;
-    p_sys->p_format->frame_rate_denominator = p_enc->fmt_in.video.i_frame_rate_base;
+    p_sys->p_format->frame_rate_numerator   = p_enc->fmt_in.video.frame_rate.num;
+    p_sys->p_format->frame_rate_denominator = p_enc->fmt_in.video.frame_rate.den;
     unsigned u_asr_num, u_asr_den;
     vlc_ureduce( &u_asr_num, &u_asr_den,
                  p_enc->fmt_in.video.i_sar_num,
@@ -1456,7 +1456,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic )
             }
         }
 
-        date_Init( &date, p_enc->fmt_in.video.i_frame_rate, p_enc->fmt_in.video.i_frame_rate_base );
+        date_Init( &date, p_enc->fmt_in.video.frame_rate.num, p_enc->fmt_in.video.frame_rate.den );
         /* FIXME - Unlike dirac-research codec Schro doesn't have a function that returns the delay in pics yet.
          *   Use a default of 1
          */
diff --git a/modules/codec/theora.c b/modules/codec/theora.c
index 31dfd612a0..268f33642a 100644
--- a/modules/codec/theora.c
+++ b/modules/codec/theora.c
@@ -329,8 +329,8 @@ static int ProcessHeaders( decoder_t *p_dec )
 
     if( p_sys->ti.fps_numerator > 0 && p_sys->ti.fps_denominator > 0 )
     {
-        p_dec->fmt_out.video.i_frame_rate = p_sys->ti.fps_numerator;
-        p_dec->fmt_out.video.i_frame_rate_base = p_sys->ti.fps_denominator;
+        p_dec->fmt_out.video.frame_rate.num = p_sys->ti.fps_numerator;
+        p_dec->fmt_out.video.frame_rate.den = p_sys->ti.fps_denominator;
     }
 
     msg_Dbg( p_dec, "%dx%d %.02f fps video, frame content "
@@ -731,16 +731,16 @@ static int OpenEncoder( vlc_object_t *p_this )
     p_sys->ti.pic_x = 0 /*frame_x_offset*/;
     p_sys->ti.pic_y = 0 /*frame_y_offset*/;
 
-    if( !p_enc->fmt_in.video.i_frame_rate ||
-        !p_enc->fmt_in.video.i_frame_rate_base )
+    if( !p_enc->fmt_in.video.frame_rate.num ||
+        !p_enc->fmt_in.video.frame_rate.den )
     {
         p_sys->ti.fps_numerator = 25;
         p_sys->ti.fps_denominator = 1;
     }
     else
     {
-        p_sys->ti.fps_numerator = p_enc->fmt_in.video.i_frame_rate;
-        p_sys->ti.fps_denominator = p_enc->fmt_in.video.i_frame_rate_base;
+        p_sys->ti.fps_numerator = p_enc->fmt_in.video.frame_rate.num;
+        p_sys->ti.fps_denominator = p_enc->fmt_in.video.frame_rate.den;
     }
 
     if( p_enc->fmt_in.video.i_sar_num > 0 && p_enc->fmt_in.video.i_sar_den > 0 )
diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index 48db054c12..3fb56525bb 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -616,7 +616,7 @@ static int StartVideoToolbox(decoder_t *p_dec)
     const unsigned i_sar_den = p_dec->fmt_out.video.i_sar_den;
 
 
-    date_Init( &p_sys->pts, p_dec->fmt_in.video.i_frame_rate * 2, p_dec->fmt_in.video.i_frame_rate_base );
+    date_Init( &p_sys->pts, p_dec->fmt_in.video.frame_rate.num * 2, p_dec->fmt_in.video.frame_rate.den );
 
     VTDictionarySetInt32(pixelaspectratio,
                          kCVImageBufferPixelAspectRatioHorizontalSpacingKey,
diff --git a/modules/codec/x264.c b/modules/codec/x264.c
index 27d9bc0319..65b973a2a8 100644
--- a/modules/codec/x264.c
+++ b/modules/codec/x264.c
@@ -1334,10 +1334,10 @@ static int  Open ( vlc_object_t *p_this )
     p_sys->param.i_timebase_num = 1;
     p_sys->param.i_timebase_den = CLOCK_FREQ;
 
-    if( p_enc->fmt_in.video.i_frame_rate_base > 0 )
+    if( p_enc->fmt_in.video.frame_rate.den > 0 )
     {
-        p_sys->param.i_fps_num = p_enc->fmt_in.video.i_frame_rate;
-        p_sys->param.i_fps_den = p_enc->fmt_in.video.i_frame_rate_base;
+        p_sys->param.i_fps_num = p_enc->fmt_in.video.frame_rate.num;
+        p_sys->param.i_fps_den = p_enc->fmt_in.video.frame_rate.den;
         p_sys->param.b_vfr_input = 0;
     }
 
@@ -1593,8 +1593,8 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict )
     {
         /* This isn't really valid for streams with B-frames */
         p_block->i_length = CLOCK_FREQ *
-            p_enc->fmt_in.video.i_frame_rate_base /
-                p_enc->fmt_in.video.i_frame_rate;
+            p_enc->fmt_in.video.frame_rate.den /
+                p_enc->fmt_in.video.frame_rate.num;
     }
 
     /* scale pts-values back*/
diff --git a/modules/codec/x265.c b/modules/codec/x265.c
index c35cf4c6ca..5a994a4a8b 100644
--- a/modules/codec/x265.c
+++ b/modules/codec/x265.c
@@ -107,8 +107,8 @@ static block_t *Encode(encoder_t *p_enc, picture_t *p_pict)
 
     /* This isn't really valid for streams with B-frames */
     p_block->i_length = CLOCK_FREQ *
-        p_enc->fmt_in.video.i_frame_rate_base /
-            p_enc->fmt_in.video.i_frame_rate;
+        p_enc->fmt_in.video.frame_rate.den /
+            p_enc->fmt_in.video.frame_rate.num;
 
     p_block->i_pts = p_sys->initial_date + pic.poc * p_block->i_length;
     p_block->i_dts = p_sys->initial_date + p_sys->dts++ * p_block->i_length;
@@ -160,16 +160,16 @@ static int  Open (vlc_object_t *p_this)
     param->maxCUSize = 16; /* use smaller macroblock */
 
 #if X265_BUILD >= 6
-    param->fpsNum = p_enc->fmt_in.video.i_frame_rate;
-    param->fpsDenom = p_enc->fmt_in.video.i_frame_rate_base;
+    param->fpsNum = p_enc->fmt_in.video.frame_rate.num;
+    param->fpsDenom = p_enc->fmt_in.video.frame_rate.den;
     if (!param->fpsNum) {
         param->fpsNum = 25;
         param->fpsDenom = 1;
     }
 #else
-    if (p_enc->fmt_in.video.i_frame_rate_base) {
-        param->frameRate = p_enc->fmt_in.video.i_frame_rate /
-            p_enc->fmt_in.video.i_frame_rate_base;
+    if (p_enc->fmt_in.video.frame_rate.den) {
+        param->frameRate = p_enc->fmt_in.video.frame_rate.num /
+            p_enc->fmt_in.video.frame_rate.den;
     } else {
         param->frameRate = 25;
     }
diff --git a/modules/demux/asf/asf.c b/modules/demux/asf/asf.c
index 64ab6f8014..0034eab21e 100644
--- a/modules/demux/asf/asf.c
+++ b/modules/demux/asf/asf.c
@@ -985,8 +985,8 @@ static int DemuxInit( demux_t *p_demux )
 
             if( p_esp && p_esp->i_average_time_per_frame > 0 )
             {
-                fmt.video.i_frame_rate = 10000000;
-                GET_CHECKED( fmt.video.i_frame_rate_base,
+                fmt.video.frame_rate.num = 10000000;
+                GET_CHECKED( fmt.video.frame_rate.den,
                              p_esp->i_average_time_per_frame,
                              UINT_MAX, uint64_t );
             }
diff --git a/modules/demux/avformat/demux.c b/modules/demux/avformat/demux.c
index 4824215c02..3aed520bbe 100644
--- a/modules/demux/avformat/demux.c
+++ b/modules/demux/avformat/demux.c
@@ -445,8 +445,8 @@ int OpenDemux( vlc_object_t *p_this )
 
 # warning FIXME: implement palette transmission
             psz_type = "video";
-            fmt.video.i_frame_rate = s->codec->time_base.num;
-            fmt.video.i_frame_rate_base = s->codec->time_base.den * __MAX( s->codec->ticks_per_frame, 1 );
+            fmt.video.frame_rate.num = s->codec->time_base.num;
+            fmt.video.frame_rate.den = s->codec->time_base.den * __MAX( s->codec->ticks_per_frame, 1 );
             fmt.video.i_sar_num = s->sample_aspect_ratio.num;
             if (s->sample_aspect_ratio.num > 0)
                 fmt.video.i_sar_den = s->sample_aspect_ratio.den;
diff --git a/modules/demux/avformat/mux.c b/modules/demux/avformat/mux.c
index 20c5e2495b..691fcf0ce7 100644
--- a/modules/demux/avformat/mux.c
+++ b/modules/demux/avformat/mux.c
@@ -253,15 +253,15 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
         break;
 
     case VIDEO_ES:
-        if( !fmt->video.i_frame_rate || !fmt->video.i_frame_rate_base ) {
+        if( !fmt->video.frame_rate.num || !fmt->video.frame_rate.den ) {
             msg_Warn( p_mux, "Missing frame rate, assuming 25fps" );
-            fmt->video.i_frame_rate = 25;
-            fmt->video.i_frame_rate_base = 1;
+            fmt->video.frame_rate.num = 25;
+            fmt->video.frame_rate.den = 1;
         } else
             msg_Dbg( p_mux, "Muxing framerate will be %d/%d = %.2f fps",
-                    fmt->video.i_frame_rate,
-                    fmt->video.i_frame_rate_base,
-                    (double)fmt->video.i_frame_rate/(double)fmt->video.i_frame_rate_base );
+                    fmt->video.frame_rate.num,
+                    fmt->video.frame_rate.den,
+                    (double)fmt->video.frame_rate.num/(double)fmt->video.frame_rate.den );
 
         codec->codec_type = AVMEDIA_TYPE_VIDEO;
         codec->width = fmt->video.i_visible_width;
@@ -273,8 +273,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
         msg_Dbg(p_mux, "Muxing aspect ratio will be %d/%d",
                 fmt->video.i_sar_num, fmt->video.i_sar_den);
         stream->sample_aspect_ratio = codec->sample_aspect_ratio;
-        stream->time_base.den = fmt->video.i_frame_rate;
-        stream->time_base.num = fmt->video.i_frame_rate_base;
+        stream->time_base.den = fmt->video.frame_rate.num;
+        stream->time_base.num = fmt->video.frame_rate.den;
         if (fmt->i_bitrate == 0) {
             msg_Warn( p_mux, "Missing video bitrate, assuming 512k" );
             fmt->i_bitrate = 512000;
diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c
index ddde3b1576..e6cc3dea9d 100644
--- a/modules/demux/avi/avi.c
+++ b/modules/demux/avi/avi.c
@@ -617,8 +617,8 @@ static int Open( vlc_object_t * p_this )
                 fmt.video.i_visible_width = fmt.video.i_width;
                 fmt.video.i_visible_height = fmt.video.i_height;
                 fmt.video.i_bits_per_pixel = p_vids->p_bih->biBitCount;
-                fmt.video.i_frame_rate = tk->i_rate;
-                fmt.video.i_frame_rate_base = tk->i_scale;
+                fmt.video.frame_rate.num = tk->i_rate;
+                fmt.video.frame_rate.den = tk->i_scale;
 
                  /* Uncompresse Bitmap or YUV, YUV being always topdown */
                 if ( fmt.video.i_height > INT32_MAX )
diff --git a/modules/demux/dirac.c b/modules/demux/dirac.c
index f7c0668bcd..82ea764be8 100644
--- a/modules/demux/dirac.c
+++ b/modules/demux/dirac.c
@@ -229,13 +229,13 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
     }
     else if( DEMUX_GET_FPS == i_query )
     {
-        if( !p_sys->p_packetizer->fmt_out.video.i_frame_rate )
+        if( !p_sys->p_packetizer->fmt_out.video.frame_rate.num )
         {
             return VLC_EGENERIC;
         }
         double *pd = (double*)va_arg( args, double * );
-        *pd = (float) p_sys->p_packetizer->fmt_out.video.i_frame_rate
-            / p_sys->p_packetizer->fmt_out.video.i_frame_rate_base;
+        *pd = (float) p_sys->p_packetizer->fmt_out.video.frame_rate.num
+            / p_sys->p_packetizer->fmt_out.video.frame_rate.den;
         return VLC_SUCCESS;
     }
     else
diff --git a/modules/demux/image.c b/modules/demux/image.c
index 1904d20119..d19a5f06f6 100644
--- a/modules/demux/image.c
+++ b/modules/demux/image.c
@@ -672,8 +672,8 @@ static int Open(vlc_object_t *object)
         fps.num      = 10;
         fps.den      = 1;
     }
-    fmt.video.i_frame_rate      = fps.num;
-    fmt.video.i_frame_rate_base = fps.den;
+    fmt.video.frame_rate.num = fps.num;
+    fmt.video.frame_rate.den = fps.den;
 
     /* If loadind failed, we still continue to avoid mis-detection
      * by other demuxers. */
@@ -695,7 +695,7 @@ static int Open(vlc_object_t *object)
     sys->is_realtime = var_InheritBool(demux, "image-realtime");
     sys->pts_origin  = sys->is_realtime ? mdate() : 0;
     sys->pts_next    = VLC_TS_INVALID;
-    date_Init(&sys->pts, fmt.video.i_frame_rate, fmt.video.i_frame_rate_base);
+    date_Init(&sys->pts, fmt.video.frame_rate.num, fmt.video.frame_rate.den);
     date_Set(&sys->pts, 0);
 
     es_format_Clean(&fmt);
diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp
index e6debbab43..410354f922 100644
--- a/modules/demux/mkv/matroska_segment_parse.cpp
+++ b/modules/demux/mkv/matroska_segment_parse.cpp
@@ -491,8 +491,8 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m )
             mkv_track_t *tk = vars.tk;
 
             tk->f_fps = 0.0;
-            tk->fmt.video.i_frame_rate_base = static_cast<unsigned>( tk->i_default_duration );
-            tk->fmt.video.i_frame_rate = 1000000;
+            tk->fmt.video.frame_rate.den = static_cast<unsigned>( tk->i_default_duration );
+            tk->fmt.video.frame_rate.num = 1000000;
 
             vars.level += 1;
             dispatcher.iterate (tkv.begin (), tkv.end (), Payload( vars ) );
@@ -1374,8 +1374,8 @@ int32_t matroska_segment_c::TrackInit( mkv_track_t * p_tk )
             if (
                 vars.p_tk->i_extra_data >= 26 && !memcmp(p+4, "VIDORV", 6) && strchr("34", p[10]) && p[11] == '0')
             {
-                vars.p_tk->fmt.video.i_frame_rate      = p[22] << 24 | p[23] << 16 | p[24] << 8 | p[25] << 0;
-                vars.p_tk->fmt.video.i_frame_rate_base = 65536;
+                vars.p_tk->fmt.video.frame_rate.num = p[22] << 24 | p[23] << 16 | p[24] << 8 | p[25] << 0;
+                vars.p_tk->fmt.video.frame_rate.den = 65536;
             }
 
             fill_extra_data( vars.p_tk, 26 );
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 8fc2132bf9..32f51f6974 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -422,9 +422,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
                 {
                     tracks_map_t::mapped_type const& track = it->second;
 
-                    if( track.fmt.i_cat == VIDEO_ES && track.fmt.video.i_frame_rate_base > 0 )
+                    if( track.fmt.i_cat == VIDEO_ES && track.fmt.video.frame_rate.den > 0 )
                     {
-                        *pf = (double)track.fmt.video.i_frame_rate / track.fmt.video.i_frame_rate_base;
+                        *pf = (double)track.fmt.video.frame_rate.num / track.fmt.video.frame_rate.den;
                         break;
                     }
                 }
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index de0d5d83df..d441faa577 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -2661,12 +2661,12 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track,
 
         /* Set frame rate */
         TrackGetESSampleRate( p_demux,
-                              &p_track->fmt.video.i_frame_rate,
-                              &p_track->fmt.video.i_frame_rate_base,
+                              &p_track->fmt.video.frame_rate.num,
+                              &p_track->fmt.video.frame_rate.den,
                               p_track, i_sample_description_index, i_chunk );
 
-        p_demux->p_sys->f_fps = (float)p_track->fmt.video.i_frame_rate /
-                                (float)p_track->fmt.video.i_frame_rate_base;
+        p_demux->p_sys->f_fps = (float)p_track->fmt.video.frame_rate.num /
+                                (float)p_track->fmt.video.frame_rate.den;
 
         break;
 
diff --git a/modules/demux/mpeg/h26x.c b/modules/demux/mpeg/h26x.c
index c5dd15582d..7abb8b184e 100644
--- a/modules/demux/mpeg/h26x.c
+++ b/modules/demux/mpeg/h26x.c
@@ -351,8 +351,8 @@ static int GenericOpen( demux_t *p_demux, const char *psz_module,
 
     /* Load the mpegvideo packetizer */
     es_format_Init( &fmt, VIDEO_ES, i_codec );
-    fmt.video.i_frame_rate = p_sys->dts.i_divider_num;
-    fmt.video.i_frame_rate_base = p_sys->dts.i_divider_den;
+    fmt.video.frame_rate.num = p_sys->dts.i_divider_num;
+    fmt.video.frame_rate.den = p_sys->dts.i_divider_den;
     p_sys->p_packetizer = demux_PacketizerNew( p_demux, &fmt, psz_module );
     if( !p_sys->p_packetizer )
     {
@@ -451,11 +451,11 @@ static int Demux( demux_t *p_demux)
                 if( !p_sys->frame_rate.den )
                 {
                     /* Use packetizer's one */
-                    if( p_sys->p_packetizer->fmt_out.video.i_frame_rate_base &&
-                        p_sys->p_packetizer->fmt_out.video.i_frame_rate )
+                    if( p_sys->p_packetizer->fmt_out.video.frame_rate.den &&
+                        p_sys->p_packetizer->fmt_out.video.frame_rate.num )
                     {
-                        p_sys->frame_rate.num = p_sys->p_packetizer->fmt_out.video.i_frame_rate;
-                        p_sys->frame_rate.den = p_sys->p_packetizer->fmt_out.video.i_frame_rate_base;
+                        p_sys->frame_rate.num = p_sys->p_packetizer->fmt_out.video.frame_rate.num;
+                        p_sys->frame_rate.den = p_sys->p_packetizer->fmt_out.video.frame_rate.den;
                     }
                     else
                     {
diff --git a/modules/demux/mpeg/ts_psi.c b/modules/demux/mpeg/ts_psi.c
index d1c81fd2ac..cd79ee1e83 100644
--- a/modules/demux/mpeg/ts_psi.c
+++ b/modules/demux/mpeg/ts_psi.c
@@ -525,8 +525,8 @@ static void SetupJ2KDescriptors( demux_t *p_demux, ts_pes_es_t *p_es, const dvbp
         p_es->fmt.i_level = p_dr->p_data[1];
         p_es->fmt.video.i_width = GetDWBE(&p_dr->p_data[2]);
         p_es->fmt.video.i_height = GetDWBE(&p_dr->p_data[6]);
-        p_es->fmt.video.i_frame_rate_base = GetWBE(&p_dr->p_data[18]);
-        p_es->fmt.video.i_frame_rate = GetWBE(&p_dr->p_data[20]);
+        p_es->fmt.video.frame_rate.den = GetWBE(&p_dr->p_data[18]);
+        p_es->fmt.video.frame_rate.num = GetWBE(&p_dr->p_data[20]);
         p_es->b_interlaced = p_dr->p_data[23] & 0x40;
         if( p_dr->i_length > 24 )
         {
diff --git a/modules/demux/ogg.c b/modules/demux/ogg.c
index 4b2b955fba..69d910970e 100644
--- a/modules/demux/ogg.c
+++ b/modules/demux/ogg.c
@@ -1765,13 +1765,13 @@ static int Ogg_FindLogicalStreams( demux_t *p_demux )
                         msg_Dbg( p_demux, "found video header of type: %.4s",
                                  (char *)&p_stream->fmt.i_codec );
 
-                        p_stream->fmt.video.i_frame_rate = 10000000;
-                        p_stream->fmt.video.i_frame_rate_base =
+                        p_stream->fmt.video.frame_rate.num = 10000000;
+                        p_stream->fmt.video.frame_rate.den =
                             GetQWLE((oggpacket.packet+164));
-                        p_stream->fmt.video.i_frame_rate_base =
-                            __MAX( p_stream->fmt.video.i_frame_rate_base, 1 );
+                        p_stream->fmt.video.frame_rate.den =
+                            __MAX( p_stream->fmt.video.frame_rate.den, 1 );
                         p_stream->f_rate = 10000000.0 /
-                            p_stream->fmt.video.i_frame_rate_base;
+                            p_stream->fmt.video.frame_rate.den;
                         p_stream->fmt.video.i_bits_per_pixel =
                             GetWLE((oggpacket.packet+182));
                         if( !p_stream->fmt.video.i_bits_per_pixel )
@@ -1899,8 +1899,8 @@ static int Ogg_FindLogicalStreams( demux_t *p_demux )
                         msg_Dbg( p_demux, "found video header of type: %.4s",
                                  (char *)&p_stream->fmt.i_codec );
 
-                        p_stream->fmt.video.i_frame_rate = 10000000;
-                        p_stream->fmt.video.i_frame_rate_base = st->time_unit;
+                        p_stream->fmt.video.frame_rate.num = 10000000;
+                        p_stream->fmt.video.frame_rate.den = st->time_unit;
                         if( st->time_unit <= 0 )
                             st->time_unit = 400000;
                         p_stream->f_rate = 10000000.0 / st->time_unit;
@@ -2576,8 +2576,8 @@ static bool Ogg_ReadTheoraHeader( logical_stream_t *p_stream,
     bs_read( &bitstream, 24 ); /* aspect_numerator */
     bs_read( &bitstream, 24 ); /* aspect_denominator */
 
-    p_stream->fmt.video.i_frame_rate = fps.num;
-    p_stream->fmt.video.i_frame_rate_base = fps.den;
+    p_stream->fmt.video.frame_rate.num = fps.num;
+    p_stream->fmt.video.frame_rate.den = fps.den;
 
     bs_read( &bitstream, 8 ); /* colorspace */
     p_stream->fmt.i_bitrate = bs_read( &bitstream, 24 );
@@ -2644,8 +2644,8 @@ static bool Ogg_ReadDaalaHeader( logical_stream_t *p_stream,
     i_timebase_denominator = oggpack_read( &opb, 32 );
     i_timebase_denominator = __MAX( i_timebase_denominator, 1 );
 
-    p_stream->fmt.video.i_frame_rate = i_timebase_numerator;
-    p_stream->fmt.video.i_frame_rate_base = i_timebase_denominator;
+    p_stream->fmt.video.frame_rate.num = i_timebase_numerator;
+    p_stream->fmt.video.frame_rate.den = i_timebase_denominator;
 
     oggpack_adv( &opb, 32 ); /* frame duration */
 
@@ -2919,11 +2919,11 @@ static bool Ogg_ReadVP8Header( demux_t *p_demux, logical_stream_t *p_stream,
         p_stream->fmt.video.i_visible_height = p_stream->fmt.video.i_height;
         p_stream->fmt.video.i_sar_num = GetDWBE( &p_oggpacket->packet[12 - 1] ) & 0x0FFF;
         p_stream->fmt.video.i_sar_den = GetDWBE( &p_oggpacket->packet[15 - 1] ) & 0x0FFF;
-        p_stream->fmt.video.i_frame_rate = GetDWBE( &p_oggpacket->packet[18] );
-        p_stream->fmt.video.i_frame_rate_base = GetDWBE( &p_oggpacket->packet[22] );
-        p_stream->fmt.video.i_frame_rate_base =
-            __MAX( p_stream->fmt.video.i_frame_rate_base, 1 );
-        p_stream->f_rate = (double) p_stream->fmt.video.i_frame_rate / p_stream->fmt.video.i_frame_rate_base;
+        p_stream->fmt.video.frame_rate.num = GetDWBE( &p_oggpacket->packet[18] );
+        p_stream->fmt.video.frame_rate.den = GetDWBE( &p_oggpacket->packet[22] );
+        p_stream->fmt.video.frame_rate.den =
+            __MAX( p_stream->fmt.video.frame_rate.den, 1 );
+        p_stream->f_rate = (double) p_stream->fmt.video.frame_rate.num / p_stream->fmt.video.frame_rate.den;
         if ( p_stream->f_rate == 0 ) return false;
         return true;
     /* METADATA */
@@ -3465,8 +3465,8 @@ static bool Ogg_ReadOggSpotsHeader( logical_stream_t *p_stream,
     }
 
     /* Normalize granulerate */
-    vlc_ureduce(&p_stream->fmt.video.i_frame_rate,
-                &p_stream->fmt.video.i_frame_rate_base,
+    vlc_ureduce(&p_stream->fmt.video.frame_rate.num,
+                &p_stream->fmt.video.frame_rate.den,
                 i_granulerate_numerator, i_granulerate_denominator, 0);
 
     p_stream->i_granule_shift = p_oggpacket->packet[28];
diff --git a/modules/demux/rawvid.c b/modules/demux/rawvid.c
index d92fd9e842..3772076931 100644
--- a/modules/demux/rawvid.c
+++ b/modules/demux/rawvid.c
@@ -332,11 +332,11 @@ valid:
                         i_width, i_height, i_width, i_height,
                         sar.num, sar.den );
 
-    vlc_ureduce( &p_sys->fmt_video.video.i_frame_rate,
-                 &p_sys->fmt_video.video.i_frame_rate_base,
+    vlc_ureduce( &p_sys->fmt_video.video.frame_rate.num,
+                 &p_sys->fmt_video.video.frame_rate.den,
                  fps.num, fps.den, 0);
-    date_Init( &p_sys->pcr, p_sys->fmt_video.video.i_frame_rate,
-               p_sys->fmt_video.video.i_frame_rate_base );
+    date_Init( &p_sys->pcr, p_sys->fmt_video.video.frame_rate.num,
+               p_sys->fmt_video.video.frame_rate.den );
     date_Set( &p_sys->pcr, 0 );
 
     if( !p_sys->fmt_video.video.i_bits_per_pixel )
diff --git a/modules/demux/real.c b/modules/demux/real.c
index fec8beb885..480baf239c 100644
--- a/modules/demux/real.c
+++ b/modules/demux/real.c
@@ -1393,8 +1393,8 @@ static int CodecVideoParse( demux_t *p_demux, int i_tk_id, const uint8_t *p_data
     fmt.video.i_height= GetWBE( &p_data[14] );
     fmt.video.i_visible_width = fmt.video.i_width;
     fmt.video.i_visible_height = fmt.video.i_height;
-    fmt.video.i_frame_rate = (GetWBE( &p_data[22] ) << 16) | GetWBE( &p_data[24] );
-    fmt.video.i_frame_rate_base = 1 << 16;
+    fmt.video.frame_rate.num = (GetWBE( &p_data[22] ) << 16) | GetWBE( &p_data[24] );
+    fmt.video.frame_rate.den = 1 << 16;
 
     fmt.i_extra = i_data - 26;
     fmt.p_extra = malloc( fmt.i_extra );
diff --git a/modules/demux/vc1.c b/modules/demux/vc1.c
index 57c85c1de9..b1967bcbec 100644
--- a/modules/demux/vc1.c
+++ b/modules/demux/vc1.c
@@ -178,11 +178,11 @@ static int Demux( demux_t *p_demux)
 
             p_block_out = p_next;
 
-            if( p_sys->p_packetizer->fmt_out.video.i_frame_rate > 0 &&
-                p_sys->p_packetizer->fmt_out.video.i_frame_rate_base > 0 )
+            if( p_sys->p_packetizer->fmt_out.video.frame_rate.num > 0 &&
+                p_sys->p_packetizer->fmt_out.video.frame_rate.den > 0 )
                 p_sys->i_dts += CLOCK_FREQ *
-                    p_sys->p_packetizer->fmt_out.video.i_frame_rate_base /
-                    p_sys->p_packetizer->fmt_out.video.i_frame_rate;
+                    p_sys->p_packetizer->fmt_out.video.frame_rate.den /
+                    p_sys->p_packetizer->fmt_out.video.frame_rate.num;
             else if( p_sys->f_fps > 0.001f )
                 p_sys->i_dts += (int64_t)((float) CLOCK_FREQ / p_sys->f_fps);
             else
diff --git a/modules/hw/mmal/codec.c b/modules/hw/mmal/codec.c
index c01d1e4635..b76eb47609 100644
--- a/modules/hw/mmal/codec.c
+++ b/modules/hw/mmal/codec.c
@@ -394,8 +394,8 @@ apply_fmt:
     dec->fmt_out.video.i_visible_height = sys->output->format->es->video.crop.height;
     dec->fmt_out.video.i_sar_num = sys->output->format->es->video.par.num;
     dec->fmt_out.video.i_sar_den = sys->output->format->es->video.par.den;
-    dec->fmt_out.video.i_frame_rate = sys->output->format->es->video.frame_rate.num;
-    dec->fmt_out.video.i_frame_rate_base = sys->output->format->es->video.frame_rate.den;
+    dec->fmt_out.video.frame_rate.num = sys->output->format->es->video.frame_rate.num;
+    dec->fmt_out.video.frame_rate.den = sys->output->format->es->video.frame_rate.den;
 
     /* Query interlaced type */
     interlace_type.hdr.id = MMAL_PARAMETER_VIDEO_INTERLACE_TYPE;
diff --git a/modules/hw/mmal/deinterlace.c b/modules/hw/mmal/deinterlace.c
index cb3148398a..74e2d84732 100644
--- a/modules/hw/mmal/deinterlace.c
+++ b/modules/hw/mmal/deinterlace.c
@@ -81,9 +81,9 @@ static void flush(filter_t *filter);
 
 static int Open(filter_t *filter)
 {
-    int32_t frame_duration = filter->fmt_in.video.i_frame_rate != 0 ?
-            (int64_t)1000000 * filter->fmt_in.video.i_frame_rate_base /
-            filter->fmt_in.video.i_frame_rate : 0;
+    int32_t frame_duration = filter->fmt_in.video.frame_rate.num != 0 ?
+            (int64_t)1000000 * filter->fmt_in.video.frame_rate.den /
+            filter->fmt_in.video.frame_rate.num : 0;
 
     MMAL_PARAMETER_IMAGEFX_PARAMETERS_T imfx_param = {
             { MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS, sizeof(imfx_param) },
@@ -150,7 +150,7 @@ static int Open(filter_t *filter)
     sys->input->format->es->video.par.den = filter->fmt_in.video.i_sar_den;
 
     es_format_Copy(&filter->fmt_out, &filter->fmt_in);
-    filter->fmt_out.video.i_frame_rate *= 2;
+    filter->fmt_out.video.frame_rate.num *= 2;
 
     status = mmal_port_format_commit(sys->input);
     if (status != MMAL_SUCCESS) {
@@ -301,8 +301,8 @@ static int send_output_buffer(filter_t *filter)
         ret = -1;
         goto out;
     }
-    picture->format.i_frame_rate = filter->fmt_out.video.i_frame_rate;
-    picture->format.i_frame_rate_base = filter->fmt_out.video.i_frame_rate_base;
+    picture->format.frame_rate.num = filter->fmt_out.video.frame_rate.num;
+    picture->format.frame_rate.den = filter->fmt_out.video.frame_rate.den;
 
     buffer = picture->p_sys->buffer;
     buffer->user_data = picture;
diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
index 761b55a0e5..f87990019a 100644
--- a/modules/hw/mmal/vout.c
+++ b/modules/hw/mmal/vout.c
@@ -557,14 +557,14 @@ static void vd_display(vout_display_t *vd, picture_t *picture,
     MMAL_BUFFER_HEADER_T *buffer = pic_sys->buffer;
     MMAL_STATUS_T status;
 
-    if (picture->format.i_frame_rate != sys->frame_rate.num ||
-        picture->format.i_frame_rate_base != sys->frame_rate.den ||
+    if (picture->format.frame_rate.num != sys->frame_rate.num ||
+        picture->format.frame_rate.den != sys->frame_rate.den ||
         picture->b_progressive != sys->b_progressive ||
         picture->b_top_field_first != sys->b_top_field_first) {
         sys->b_top_field_first = picture->b_top_field_first;
         sys->b_progressive = picture->b_progressive;
-        sys->frame_rate.num = picture->format.i_frame_rate;
-        sys->frame_rate.den = picture->format.i_frame_rate_base;
+        sys->frame_rate.num = picture->format.frame_rate.num;
+        sys->frame_rate.den = picture->format.frame_rate.den;
         configure_display(vd, NULL, &picture->format);
     }
 
@@ -772,7 +772,7 @@ static void adjust_refresh_rate(vout_display_t *vd, const video_format_t *fmt)
     TV_SUPPORTED_MODE_NEW_T supported_modes[VC_TV_MAX_MODE_IDS];
     char response[20]; /* answer is hvs_update_fields=%1d */
     int num_modes;
-    double frame_rate = (double)fmt->i_frame_rate / fmt->i_frame_rate_base;
+    double frame_rate = (double)fmt->frame_rate.num / fmt->frame_rate.den;
     int best_id = -1;
     double best_score, score;
     int i;
diff --git a/modules/hw/vdpau/deinterlace.c b/modules/hw/vdpau/deinterlace.c
index a1370a7560..43497234cf 100644
--- a/modules/hw/vdpau/deinterlace.c
+++ b/modules/hw/vdpau/deinterlace.c
@@ -70,9 +70,9 @@ static picture_t *Deinterlace(filter_t *filter, picture_t *src)
     if (last_pts != VLC_TS_INVALID)
         dst->date = (3 * src->date - last_pts) / 2;
     else
-    if (filter->fmt_in.video.i_frame_rate != 0)
-        dst->date = src->date + ((filter->fmt_in.video.i_frame_rate_base
-                            * CLOCK_FREQ) / filter->fmt_in.video.i_frame_rate);
+    if (filter->fmt_in.video.frame_rate.num != 0)
+        dst->date = src->date + ((filter->fmt_in.video.frame_rate.den
+                            * CLOCK_FREQ) / filter->fmt_in.video.frame_rate.num);
     dst->b_top_field_first = !src->b_top_field_first;
     dst->i_nb_fields = 1;
     src->i_nb_fields = 1;
@@ -118,7 +118,7 @@ static int Open(vlc_object_t *obj)
 
     filter->pf_video_filter = Deinterlace;
     filter->p_sys = sys;
-    filter->fmt_out.video.i_frame_rate *= 2;
+    filter->fmt_out.video.frame_rate.num *= 2;
     return VLC_SUCCESS;
 }
 
diff --git a/modules/mux/asf.c b/modules/mux/asf.c
index f30c1ab77f..ca5d172567 100644
--- a/modules/mux/asf.c
+++ b/modules/mux/asf.c
@@ -961,9 +961,9 @@ static block_t *asf_header_create( sout_mux_t *p_mux, bool b_broadcast )
 
         uint64_t i_avg_duration = 0;
         if( p_fmt->i_cat == VIDEO_ES &&
-            p_fmt->video.i_frame_rate > 0 && p_fmt->video.i_frame_rate_base > 0 )
-            i_avg_duration = ( INT64_C(10000000) * p_fmt->video.i_frame_rate_base +
-                               p_fmt->video.i_frame_rate/2 ) / p_fmt->video.i_frame_rate;
+            p_fmt->video.frame_rate.num > 0 && p_fmt->video.frame_rate.den > 0 )
+            i_avg_duration = ( INT64_C(10000000) * p_fmt->video.frame_rate.den +
+                               p_fmt->video.frame_rate.num/2 ) / p_fmt->video.frame_rate.num;
 
         bo_add_guid ( &bo, &asf_object_extended_stream_properties_guid );
         bo_addle_u64( &bo, 88 );
diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c
index d9f2068851..f1019b79b3 100644
--- a/modules/mux/mp4/mp4.c
+++ b/modules/mux/mp4/mp4.c
@@ -425,17 +425,17 @@ static int AddStream(sout_mux_t *p_mux, sout_input_t *p_input)
         p_stream->mux.i_timescale = p_stream->mux.fmt.audio.i_rate;
         break;
     case VIDEO_ES:
-        if( !p_stream->mux.fmt.video.i_frame_rate ||
-            !p_stream->mux.fmt.video.i_frame_rate_base )
+        if( !p_stream->mux.fmt.video.frame_rate.num ||
+            !p_stream->mux.fmt.video.frame_rate.den )
         {
             msg_Warn( p_mux, "Missing frame rate for stream %d, assuming 25fps",
                       p_sys->i_nb_streams );
-            p_stream->mux.fmt.video.i_frame_rate = 25;
-            p_stream->mux.fmt.video.i_frame_rate_base = 1;
+            p_stream->mux.fmt.video.frame_rate.num = 25;
+            p_stream->mux.fmt.video.frame_rate.den = 1;
         }
 
-        p_stream->mux.i_timescale = p_stream->mux.fmt.video.i_frame_rate *
-                                    p_stream->mux.fmt.video.i_frame_rate_base;
+        p_stream->mux.i_timescale = p_stream->mux.fmt.video.frame_rate.num *
+                                    p_stream->mux.fmt.video.frame_rate.den;
 
         if( p_stream->mux.i_timescale > CLOCK_FREQ )
             p_stream->mux.i_timescale = CLOCK_FREQ;
@@ -633,8 +633,8 @@ static int Mux(sout_mux_t *p_mux)
                     if ( p_stream->mux.fmt.i_cat == VIDEO_ES )
                     {
                         p_data->i_length = CLOCK_FREQ *
-                                           p_stream->mux.fmt.video.i_frame_rate_base /
-                                           p_stream->mux.fmt.video.i_frame_rate;
+                                           p_stream->mux.fmt.video.frame_rate.den /
+                                           p_stream->mux.fmt.video.frame_rate.num;
                         msg_Dbg( p_mux, "video track %u fixup to %"PRId64" for sample %u",
                                  p_stream->mux.i_track_id, p_data->i_length, p_stream->mux.i_entry_count );
                     }
@@ -1276,11 +1276,11 @@ static void WriteFragments(sout_mux_t *p_mux, bool b_flush)
  * This is the end boundary case. */
 static void LengthLocalFixup(sout_mux_t *p_mux, const mp4_stream_t *p_stream, block_t *p_entrydata)
 {
-    if ( p_stream->mux.fmt.i_cat == VIDEO_ES && p_stream->mux.fmt.video.i_frame_rate )
+    if ( p_stream->mux.fmt.i_cat == VIDEO_ES && p_stream->mux.fmt.video.frame_rate.num )
     {
         p_entrydata->i_length = CLOCK_FREQ *
-                p_stream->mux.fmt.video.i_frame_rate_base /
-                p_stream->mux.fmt.video.i_frame_rate;
+                p_stream->mux.fmt.video.frame_rate.den /
+                p_stream->mux.fmt.video.frame_rate.num;
         msg_Dbg(p_mux, "video track %d fixup to %"PRId64" for sample %u",
                 p_stream->mux.i_track_id, p_entrydata->i_length, p_stream->mux.i_entry_count - 1);
     }
diff --git a/modules/mux/mpeg/ts.c b/modules/mux/mpeg/ts.c
index 5fa30de39e..e38de3a54c 100644
--- a/modules/mux/mpeg/ts.c
+++ b/modules/mux/mpeg/ts.c
@@ -1147,12 +1147,12 @@ static void SetBlockDuration( sout_input_t *p_input, block_t *p_data )
         {
             /* Try rates */
             if( p_input->p_fmt->i_cat == VIDEO_ES &&
-                p_input->p_fmt->video.i_frame_rate &&
-                p_input->p_fmt->video.i_frame_rate_base )
+                p_input->p_fmt->video.frame_rate.num &&
+                p_input->p_fmt->video.frame_rate.den )
             {
                 p_data->i_length = CLOCK_FREQ *
-                                   p_input->p_fmt->video.i_frame_rate /
-                                   p_input->p_fmt->video.i_frame_rate_base;
+                                   p_input->p_fmt->video.frame_rate.num /
+                                   p_input->p_fmt->video.frame_rate.den;
             }
             else if( p_input->p_fmt->i_cat == AUDIO_ES &&
                      p_input->p_fmt->audio.i_bytes_per_frame &&
diff --git a/modules/mux/ogg.c b/modules/mux/ogg.c
index 03789b7054..31adf532d6 100644
--- a/modules/mux/ogg.c
+++ b/modules/mux/ogg.c
@@ -377,13 +377,13 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
     switch( p_input->p_fmt->i_cat )
     {
     case VIDEO_ES:
-        if( !p_input->p_fmt->video.i_frame_rate ||
-            !p_input->p_fmt->video.i_frame_rate_base )
+        if( !p_input->p_fmt->video.frame_rate.num ||
+            !p_input->p_fmt->video.frame_rate.den )
         {
             msg_Warn( p_mux, "Missing frame rate, assuming 25fps" );
             assert(p_input->p_fmt == &p_input->fmt);
-            p_input->fmt.video.i_frame_rate = 25;
-            p_input->fmt.video.i_frame_rate_base = 1;
+            p_input->fmt.video.frame_rate.num = 25;
+            p_input->fmt.video.frame_rate.den = 1;
         }
 
         switch( p_stream->i_fourcc )
@@ -421,8 +421,8 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
             }
             p_stream->p_oggds_header->i_size = 0 ;
             p_stream->p_oggds_header->i_time_unit =
-                     INT64_C(10000000) * p_input->p_fmt->video.i_frame_rate_base /
-                     (int64_t)p_input->p_fmt->video.i_frame_rate;
+                     INT64_C(10000000) * p_input->p_fmt->video.frame_rate.den /
+                     (int64_t)p_input->p_fmt->video.frame_rate.num;
             p_stream->p_oggds_header->i_samples_per_unit = 1;
             p_stream->p_oggds_header->i_default_len = 1 ; /* ??? */
             p_stream->p_oggds_header->i_buffer_size = 1024*1024;
@@ -827,8 +827,8 @@ static void OggGetSkeletonFisbone( uint8_t **pp_buffer, long *pi_size,
     switch ( p_input->p_fmt->i_cat )
     {
         case VIDEO_ES:
-            SetQWLE( &(*pp_buffer)[20], p_input->p_fmt->video.i_frame_rate );
-            SetQWLE( &(*pp_buffer)[28], p_input->p_fmt->video.i_frame_rate_base );
+            SetQWLE( &(*pp_buffer)[20], p_input->p_fmt->video.frame_rate.num );
+            SetQWLE( &(*pp_buffer)[28], p_input->p_fmt->video.frame_rate.den );
         break;
         case AUDIO_ES:
             SetQWLE( &(*pp_buffer)[20], p_input->p_fmt->audio.i_rate );
@@ -929,8 +929,8 @@ static void OggFillVP8Header( uint8_t *p_buffer, sout_input_t *p_input )
     SetDWBE( &p_buffer[14], p_input->p_fmt->video.i_sar_den );/* 24 bits, 15~ */
     SetDWBE( &p_buffer[11], p_input->p_fmt->video.i_sar_num );/* 24 bits, 12~ */
     SetWBE( &p_buffer[10], p_input->p_fmt->video.i_height );
-    SetDWBE( &p_buffer[18], p_input->p_fmt->video.i_frame_rate );
-    SetDWBE( &p_buffer[22], p_input->p_fmt->video.i_frame_rate_base );
+    SetDWBE( &p_buffer[18], p_input->p_fmt->video.frame_rate.num );
+    SetDWBE( &p_buffer[22], p_input->p_fmt->video.frame_rate.den );
 }
 
 static bool OggCreateHeaders( sout_mux_t *p_mux )
@@ -1431,13 +1431,13 @@ static bool AllocateIndex( sout_mux_t *p_mux, sout_input_t *p_input )
         uint64_t i;
 
         if( p_input->p_fmt->i_cat == VIDEO_ES &&
-                p_input->p_fmt->video.i_frame_rate )
+                p_input->p_fmt->video.frame_rate.num )
         {
             /* optimize for fps < 1 */
             i_interval= __MAX( p_mux->p_sys->skeleton.i_index_intvl * 1000,
                        INT64_C(10000000) *
-                       p_input->p_fmt->video.i_frame_rate_base /
-                       p_input->p_fmt->video.i_frame_rate );
+                       p_input->p_fmt->video.frame_rate.den /
+                       p_input->p_fmt->video.frame_rate.num );
         }
 
         size_t i_tuple_size = 0;
@@ -1642,7 +1642,7 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input )
 
                 /* presentation time */
                 i_time = CLOCK_FREQ * ( p_stream->i_num_frames - 1 ) *
-                         p_input->p_fmt->video.i_frame_rate_base /  p_input->p_fmt->video.i_frame_rate;
+                         p_input->p_fmt->video.frame_rate.den /  p_input->p_fmt->video.frame_rate.num;
                 AddIndexEntry( p_mux, i_time, p_input );
             }
 
@@ -1657,10 +1657,10 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input )
         a += 5000;\
     a /= CLOCK_FREQ;
 
-            mtime_t dt = (p_data->i_dts - p_sys->i_start_dts) * p_input->p_fmt->video.i_frame_rate / p_input->p_fmt->video.i_frame_rate_base;
+            mtime_t dt = (p_data->i_dts - p_sys->i_start_dts) * p_input->p_fmt->video.frame_rate.num / p_input->p_fmt->video.frame_rate.den;
             FRAME_ROUND( dt );
 
-            mtime_t pt = (p_data->i_pts - p_sys->i_start_dts - p_stream->i_baseptsdelay ) * p_input->p_fmt->video.i_frame_rate / p_input->p_fmt->video.i_frame_rate_base;
+            mtime_t pt = (p_data->i_pts - p_sys->i_start_dts - p_stream->i_baseptsdelay ) * p_input->p_fmt->video.frame_rate.num / p_input->p_fmt->video.frame_rate.den;
             FRAME_ROUND( pt );
 
             /* (shro) some PTS could be repeated within 1st frames */
@@ -1710,7 +1710,7 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input )
 
                 /* presentation time */
                 i_time = CLOCK_FREQ * ( p_stream->i_num_frames - 1 ) *
-                         p_input->p_fmt->video.i_frame_rate_base /  p_input->p_fmt->video.i_frame_rate;
+                         p_input->p_fmt->video.frame_rate.den /  p_input->p_fmt->video.frame_rate.num;
                 AddIndexEntry( p_mux, i_time, p_input );
             }
             op.granulepos = ( ((int64_t)p_stream->i_num_frames) << 32 ) |
diff --git a/modules/packetizer/dirac.c b/modules/packetizer/dirac.c
index 359a046739..e6f1acdc92 100644
--- a/modules/packetizer/dirac.c
+++ b/modules/packetizer/dirac.c
@@ -904,7 +904,7 @@ static int dirac_InspectDataUnit( decoder_t *p_dec, block_t **pp_block, block_t
         p_es->video.i_width  = p_sys->seq_hdr.u_width;
         p_es->video.i_height = p_sys->seq_hdr.u_height;
 
-        vlc_ureduce( &p_es->video.i_frame_rate, &p_es->video.i_frame_rate_base
+        vlc_ureduce( &p_es->video.frame_rate.num, &p_es->video.frame_rate.den
                    , p_sys->seq_hdr.u_fps_num, p_sys->seq_hdr.u_fps_den, 0 );
 
         /* when field coding, dts needs to be incremented in terms of field periods */
@@ -918,7 +918,7 @@ static int dirac_InspectDataUnit( decoder_t *p_dec, block_t **pp_block, block_t
         /* TODO: set p_sys->reorder_buf.u_size_max */
         p_sys->i_pts_offset = p_sys->reorder_buf.u_size_max
                             * 1000000
-                            * p_es->video.i_frame_rate_base / p_es->video.i_frame_rate + 1;
+                            * p_es->video.frame_rate.den / p_es->video.frame_rate.num + 1;
 
         /* stash a copy of the seqhdr
          *  - required for ogg muxing
diff --git a/modules/packetizer/h264.c b/modules/packetizer/h264.c
index 84044b5366..fcc2206fd1 100644
--- a/modules/packetizer/h264.c
+++ b/modules/packetizer/h264.c
@@ -207,16 +207,16 @@ static void ActivateSets( decoder_t *p_dec, const h264_sequence_parameter_set_t
 
         if( p_sps->vui.b_valid )
         {
-            if( !p_dec->fmt_in.video.i_frame_rate_base &&
+            if( !p_dec->fmt_in.video.frame_rate.den &&
                  p_sps->vui.b_fixed_frame_rate && p_sps->vui.i_num_units_in_tick > 0 )
             {
                 const unsigned i_rate_base = p_sps->vui.i_num_units_in_tick;
                 const unsigned i_rate = p_sps->vui.i_time_scale >> 1; /* num_clock_ts == 2 */
-                if( i_rate_base != p_dec->fmt_out.video.i_frame_rate_base ||
-                    i_rate != p_dec->fmt_out.video.i_frame_rate )
+                if( i_rate_base != p_dec->fmt_out.video.frame_rate.den ||
+                    i_rate != p_dec->fmt_out.video.frame_rate.num )
                 {
-                    p_dec->fmt_out.video.i_frame_rate_base = i_rate_base;
-                    p_dec->fmt_out.video.i_frame_rate = i_rate;
+                    p_dec->fmt_out.video.frame_rate.den = i_rate_base;
+                    p_dec->fmt_out.video.frame_rate.num = i_rate;
                     date_Change( &p_sys->dts, p_sps->vui.i_time_scale, p_sps->vui.i_num_units_in_tick );
                 }
             }
@@ -350,10 +350,10 @@ static int Open( vlc_object_t *p_this )
     p_dec->fmt_out.i_codec = VLC_CODEC_H264;
     p_dec->fmt_out.b_packetized = true;
 
-    if( p_dec->fmt_in.video.i_frame_rate_base > 0 )
+    if( p_dec->fmt_in.video.frame_rate.den > 0 )
     {
-        date_Change( &p_sys->dts, p_dec->fmt_in.video.i_frame_rate * 2,
-                                  p_dec->fmt_in.video.i_frame_rate_base );
+        date_Change( &p_sys->dts, p_dec->fmt_in.video.frame_rate.num * 2,
+                                  p_dec->fmt_in.video.frame_rate.den );
     }
 
     if( b_avc )
diff --git a/modules/packetizer/hevc.c b/modules/packetizer/hevc.c
index 21ed17451d..451d3183bb 100644
--- a/modules/packetizer/hevc.c
+++ b/modules/packetizer/hevc.c
@@ -438,11 +438,11 @@ static void ActivateSets(decoder_t *p_dec,
     p_sys->p_active_vps = p_vps;
     if(p_sps)
     {
-        if(!p_dec->fmt_in.video.i_frame_rate)
+        if(!p_dec->fmt_in.video.frame_rate.num)
         {
             (void) hevc_get_frame_rate( p_sps, p_dec->p_sys->rgi_p_decvps,
-                                        &p_dec->fmt_out.video.i_frame_rate,
-                                        &p_dec->fmt_out.video.i_frame_rate_base );
+                                        &p_dec->fmt_out.video.frame_rate.num,
+                                        &p_dec->fmt_out.video.frame_rate.den );
         }
 
         if(p_dec->fmt_in.video.primaries == COLOR_PRIMARIES_UNDEF)
diff --git a/modules/packetizer/mpeg4video.c b/modules/packetizer/mpeg4video.c
index 9a9e8441a2..f002d7a860 100644
--- a/modules/packetizer/mpeg4video.c
+++ b/modules/packetizer/mpeg4video.c
@@ -544,12 +544,12 @@ static int ParseVOP( decoder_t *p_dec, block_t *p_vop )
 #endif
 
     if( p_dec->p_sys->fps.num < 5 && /* Work-around buggy streams */
-        p_dec->fmt_in.video.i_frame_rate > 0 &&
-        p_dec->fmt_in.video.i_frame_rate_base > 0 )
+        p_dec->fmt_in.video.frame_rate.num > 0 &&
+        p_dec->fmt_in.video.frame_rate.den > 0 )
     {
         p_sys->i_interpolated_pts += CLOCK_FREQ *
-        p_dec->fmt_in.video.i_frame_rate_base /
-        p_dec->fmt_in.video.i_frame_rate;
+        p_dec->fmt_in.video.frame_rate.den /
+        p_dec->fmt_in.video.frame_rate.num;
     }
     else if( p_dec->p_sys->fps.num )
         p_sys->i_interpolated_pts +=
diff --git a/modules/packetizer/mpegvideo.c b/modules/packetizer/mpegvideo.c
index 5540b96801..074df99a16 100644
--- a/modules/packetizer/mpegvideo.c
+++ b/modules/packetizer/mpegvideo.c
@@ -660,14 +660,14 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
         p_sys->frame_rate.den =
             code_to_frame_rate[p_frag->p_buffer[7]&0x0f][1];
 
-        if( p_sys->frame_rate.num != p_dec->fmt_out.video.i_frame_rate ||
-            p_dec->fmt_out.video.i_frame_rate_base != p_sys->frame_rate.den )
+        if( p_sys->frame_rate.num != p_dec->fmt_out.video.frame_rate.num ||
+            p_dec->fmt_out.video.frame_rate.den != p_sys->frame_rate.den )
         {
             date_Change( &p_sys->dts, 2 * p_sys->frame_rate.num, p_sys->frame_rate.den );
             date_Change( &p_sys->prev_iframe_dts, 2 * p_sys->frame_rate.num, p_sys->frame_rate.den );
         }
-        p_dec->fmt_out.video.i_frame_rate = p_sys->frame_rate.num;
-        p_dec->fmt_out.video.i_frame_rate_base = p_sys->frame_rate.den;
+        p_dec->fmt_out.video.frame_rate.num = p_sys->frame_rate.num;
+        p_dec->fmt_out.video.frame_rate.den = p_sys->frame_rate.den;
 
         p_sys->b_seq_progressive = true;
         p_sys->b_low_delay = true;
diff --git a/modules/packetizer/vc1.c b/modules/packetizer/vc1.c
index fab961b199..19c1fbdcee 100644
--- a/modules/packetizer/vc1.c
+++ b/modules/packetizer/vc1.c
@@ -380,12 +380,12 @@ static block_t *ParseIDU( decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag )
             p_sys->i_interpolated_dts = p_pic->i_dts;
 
         /* We can interpolate dts/pts only if we have a frame rate */
-        if( p_dec->fmt_out.video.i_frame_rate != 0 && p_dec->fmt_out.video.i_frame_rate_base != 0 )
+        if( p_dec->fmt_out.video.frame_rate.num != 0 && p_dec->fmt_out.video.frame_rate.den != 0 )
         {
             if( p_sys->i_interpolated_dts > VLC_TS_INVALID )
                 p_sys->i_interpolated_dts += INT64_C(1000000) *
-                                             p_dec->fmt_out.video.i_frame_rate_base /
-                                             p_dec->fmt_out.video.i_frame_rate;
+                                             p_dec->fmt_out.video.frame_rate.den /
+                                             p_dec->fmt_out.video.frame_rate.num;
 
             //msg_Dbg( p_dec, "-------------- XXX0 dts=%"PRId64" pts=%"PRId64" interpolated=%"PRId64,
             //         p_pic->i_dts, p_pic->i_pts, p_sys->i_interpolated_dts );
@@ -570,10 +570,10 @@ static block_t *ParseIDU( decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag )
                     }
                 }
                 if( i_fps_num != 0 && i_fps_den != 0 )
-                    vlc_ureduce( &p_es->video.i_frame_rate, &p_es->video.i_frame_rate_base, i_fps_num, i_fps_den, 0 );
+                    vlc_ureduce( &p_es->video.frame_rate.num, &p_es->video.frame_rate.den, i_fps_num, i_fps_den, 0 );
 
                 if( !p_sys->b_sequence_header )
-                    msg_Dbg( p_dec, "frame rate %d/%d", p_es->video.i_frame_rate, p_es->video.i_frame_rate_base );
+                    msg_Dbg( p_dec, "frame rate %d/%d", p_es->video.frame_rate.num, p_es->video.frame_rate.den );
             }
             if( bs_read1( &s ) ) /* Color Format */
             {
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index bd282007d3..d48cddb818 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -404,40 +404,40 @@ static void transcode_video_framerate_init( sout_stream_t *p_stream,
                                             const es_format_t *p_fmt_out )
 {
     /* Handle frame rate conversion */
-    if( !id->p_encoder->fmt_out.video.i_frame_rate ||
-        !id->p_encoder->fmt_out.video.i_frame_rate_base )
+    if( !id->p_encoder->fmt_out.video.frame_rate.num ||
+        !id->p_encoder->fmt_out.video.frame_rate.den )
     {
-        if( p_fmt_out->video.i_frame_rate &&
-            p_fmt_out->video.i_frame_rate_base )
+        if( p_fmt_out->video.frame_rate.num &&
+            p_fmt_out->video.frame_rate.den )
         {
-            id->p_encoder->fmt_out.video.i_frame_rate =
-                p_fmt_out->video.i_frame_rate;
-            id->p_encoder->fmt_out.video.i_frame_rate_base =
-                p_fmt_out->video.i_frame_rate_base;
+            id->p_encoder->fmt_out.video.frame_rate.num =
+                p_fmt_out->video.frame_rate.num;
+            id->p_encoder->fmt_out.video.frame_rate.den =
+                p_fmt_out->video.frame_rate.den;
         }
         else
         {
             /* Pick a sensible default value */
-            id->p_encoder->fmt_out.video.i_frame_rate = ENC_FRAMERATE;
-            id->p_encoder->fmt_out.video.i_frame_rate_base = ENC_FRAMERATE_BASE;
+            id->p_encoder->fmt_out.video.frame_rate.num = ENC_FRAMERATE;
+            id->p_encoder->fmt_out.video.frame_rate.den = ENC_FRAMERATE_BASE;
         }
     }
 
-    id->p_encoder->fmt_in.video.i_frame_rate =
-        id->p_encoder->fmt_out.video.i_frame_rate;
-    id->p_encoder->fmt_in.video.i_frame_rate_base =
-        id->p_encoder->fmt_out.video.i_frame_rate_base;
+    id->p_encoder->fmt_in.video.frame_rate.num =
+        id->p_encoder->fmt_out.video.frame_rate.num;
+    id->p_encoder->fmt_in.video.frame_rate.den =
+        id->p_encoder->fmt_out.video.frame_rate.den;
 
-    vlc_ureduce( &id->p_encoder->fmt_in.video.i_frame_rate,
-        &id->p_encoder->fmt_in.video.i_frame_rate_base,
-        id->p_encoder->fmt_in.video.i_frame_rate,
-        id->p_encoder->fmt_in.video.i_frame_rate_base,
+    vlc_ureduce( &id->p_encoder->fmt_in.video.frame_rate.num,
+        &id->p_encoder->fmt_in.video.frame_rate.den,
+        id->p_encoder->fmt_in.video.frame_rate.num,
+        id->p_encoder->fmt_in.video.frame_rate.den,
         0 );
      msg_Dbg( p_stream, "source fps %u/%u, destination %u/%u",
-        id->p_decoder->fmt_out.video.i_frame_rate,
-        id->p_decoder->fmt_out.video.i_frame_rate_base,
-        id->p_encoder->fmt_in.video.i_frame_rate,
-        id->p_encoder->fmt_in.video.i_frame_rate_base );
+        id->p_decoder->fmt_out.video.frame_rate.num,
+        id->p_decoder->fmt_out.video.frame_rate.den,
+        id->p_encoder->fmt_in.video.frame_rate.num,
+        id->p_encoder->fmt_in.video.frame_rate.den );
 
 }
 
@@ -956,8 +956,8 @@ bool transcode_video_add( sout_stream_t *p_stream, const es_format_t *p_fmt,
 
     if( p_sys->fps.num )
     {
-        id->p_encoder->fmt_in.video.i_frame_rate = id->p_encoder->fmt_out.video.i_frame_rate = p_sys->fps.num;
-        id->p_encoder->fmt_in.video.i_frame_rate_base = id->p_encoder->fmt_out.video.i_frame_rate_base = (p_sys->fps.den ? p_sys->fps.den : 1);
+        id->p_encoder->fmt_in.video.frame_rate.num = id->p_encoder->fmt_out.video.frame_rate.num = p_sys->fps.num;
+        id->p_encoder->fmt_in.video.frame_rate.den = id->p_encoder->fmt_out.video.frame_rate.den = (p_sys->fps.den ? p_sys->fps.den : 1);
     }
 
     return true;
diff --git a/modules/video_filter/deinterlace/deinterlace.c b/modules/video_filter/deinterlace/deinterlace.c
index 5e56eb88e0..d260491921 100644
--- a/modules/video_filter/deinterlace/deinterlace.c
+++ b/modules/video_filter/deinterlace/deinterlace.c
@@ -251,7 +251,7 @@ static void GetOutputFormat( filter_t *p_filter,
 
     if( p_sys->b_double_rate )
     {
-        p_dst->i_frame_rate *= 2;
+        p_dst->frame_rate.num *= 2;
     }
 
     if( p_sys->i_mode == DEINTERLACE_PHOSPHOR  &&
diff --git a/modules/video_filter/fps.c b/modules/video_filter/fps.c
index 146c870e72..1a528ae424 100644
--- a/modules/video_filter/fps.c
+++ b/modules/video_filter/fps.c
@@ -80,8 +80,8 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_picture)
         return NULL;
     }
 
-    p_picture->format.i_frame_rate = p_filter->fmt_out.video.i_frame_rate;
-    p_picture->format.i_frame_rate_base = p_filter->fmt_out.video.i_frame_rate_base;
+    p_picture->format.frame_rate.num = p_filter->fmt_out.video.frame_rate.num;
+    p_picture->format.frame_rate.den = p_filter->fmt_out.video.frame_rate.den;
 
     /* First time we get some valid timestamp, we'll take it as base for output
         later on we retake new timestamp if it has jumped too much */
@@ -153,20 +153,20 @@ static int Open( vlc_object_t *p_this)
     /* If we don't have fps option, use filter output values */
     if( var_InheritURational( p_filter, &fps, CFG_PREFIX "fps" ) )
     {
-        fps.num = p_filter->fmt_in.video.i_frame_rate;
-        fps.den = p_filter->fmt_in.video.i_frame_rate_base;
+        fps.num = p_filter->fmt_in.video.frame_rate.num;
+        fps.den = p_filter->fmt_in.video.frame_rate.den;
     }
-    p_filter->fmt_out.video.i_frame_rate      = fps.num;
-    p_filter->fmt_out.video.i_frame_rate_base = fps.den;
+    p_filter->fmt_out.video.frame_rate.num      = fps.num;
+    p_filter->fmt_out.video.frame_rate.den = fps.den;
 
     msg_Dbg( p_filter, "Converting fps from %d/%d -> %d/%d",
-            p_filter->fmt_in.video.i_frame_rate, p_filter->fmt_in.video.i_frame_rate_base,
-            p_filter->fmt_out.video.i_frame_rate, p_filter->fmt_out.video.i_frame_rate_base );
+            p_filter->fmt_in.video.frame_rate.num, p_filter->fmt_in.video.frame_rate.den,
+            p_filter->fmt_out.video.frame_rate.num, p_filter->fmt_out.video.frame_rate.den );
 
-    p_sys->i_output_frame_interval = p_filter->fmt_out.video.i_frame_rate_base * CLOCK_FREQ / p_filter->fmt_out.video.i_frame_rate;
+    p_sys->i_output_frame_interval = p_filter->fmt_out.video.frame_rate.den * CLOCK_FREQ / p_filter->fmt_out.video.frame_rate.num;
 
     date_Init( &p_sys->next_output_pts,
-               p_filter->fmt_out.video.i_frame_rate, p_filter->fmt_out.video.i_frame_rate_base );
+               p_filter->fmt_out.video.frame_rate.num, p_filter->fmt_out.video.frame_rate.den );
 
     date_Set( &p_sys->next_output_pts, VLC_TS_INVALID );
     p_sys->p_previous_pic = NULL;
diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp
index 35cb1ada38..cdd87ad83b 100644
--- a/modules/video_output/decklink.cpp
+++ b/modules/video_output/decklink.cpp
@@ -529,7 +529,7 @@ static IDeckLinkDisplayMode * MatchDisplayMode(vout_display_t *vd,
                         unsigned int num_stream, den_stream;
                         vlc_ureduce(&num_deck, &den_deck, timescale, frameduration, 0);
                         vlc_ureduce(&num_stream, &den_stream,
-                                    fmt->i_frame_rate, fmt->i_frame_rate_base, 0);
+                                    fmt->frame_rate.num, fmt->frame_rate.den, 0);
 
                         if (num_deck == num_stream && den_deck == den_stream)
                         {
@@ -707,8 +707,8 @@ static int OpenDecklink(vout_display_t *vd, decklink_sys_t *sys)
         fmt->i_sar_num = 0;
         fmt->i_sar_den = 0;
         fmt->i_chroma = !sys->video.tenbits ? VLC_CODEC_UYVY : VLC_CODEC_I422_10L; /* we will convert to v210 */
-        fmt->i_frame_rate = (unsigned) sys->frameduration;
-        fmt->i_frame_rate_base = (unsigned) sys->timescale;
+        fmt->frame_rate.num = (unsigned) sys->frameduration;
+        fmt->frame_rate.den = (unsigned) sys->timescale;
     }
 
     if (/*decklink_sys->i_channels > 0 &&*/ sys->i_rate > 0)
diff --git a/modules/video_output/yuv.c b/modules/video_output/yuv.c
index 1fcc9e9f05..fe61a7c93b 100644
--- a/modules/video_output/yuv.c
+++ b/modules/video_output/yuv.c
@@ -243,7 +243,7 @@ static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
         fprintf(sys->f, "%s W%d H%d F%d:%d I%c A%d:%d\n",
                 header,
                 fmt.i_visible_width, fmt.i_visible_height,
-                fmt.i_frame_rate, fmt.i_frame_rate_base,
+                fmt.frame_rate.num, fmt.frame_rate.den,
                 type,
                 fmt.i_sar_num, fmt.i_sar_den);
         sys->is_first = true;
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 384c09ae04..6a95939dae 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -1593,11 +1593,11 @@ static es_out_id_t *EsOutAddSlave( es_out_t *out, const es_format_t *fmt, es_out
             es->fmt.video.i_visible_height = es->fmt.video.i_height;
         }
 
-        if( es->fmt.video.i_frame_rate && es->fmt.video.i_frame_rate_base )
-            vlc_ureduce( &es->fmt.video.i_frame_rate,
-                         &es->fmt.video.i_frame_rate_base,
-                         es->fmt.video.i_frame_rate,
-                         es->fmt.video.i_frame_rate_base, 0 );
+        if( es->fmt.video.frame_rate.num && es->fmt.video.frame_rate.den )
+            vlc_ureduce( &es->fmt.video.frame_rate.num,
+                         &es->fmt.video.frame_rate.den,
+                         es->fmt.video.frame_rate.num,
+                         es->fmt.video.frame_rate.den, 0 );
         break;
 
     case SPU_ES:
@@ -3069,11 +3069,11 @@ static void EsOutUpdateInfo( es_out_t *out, es_out_id_t *es, const es_format_t *
             info_category_AddInfo( p_cat, _("Buffer dimensions"), "%ux%u",
                                    fmt->video.i_width, fmt->video.i_height );
 
-       if( fmt->video.i_frame_rate > 0 &&
-           fmt->video.i_frame_rate_base > 0 )
+       if( fmt->video.frame_rate.num > 0 &&
+           fmt->video.frame_rate.den > 0 )
        {
-           div = lldiv( (float)fmt->video.i_frame_rate /
-                               fmt->video.i_frame_rate_base * 1000000,
+           div = lldiv( (float)fmt->video.frame_rate.num /
+                               fmt->video.frame_rate.den * 1000000,
                                1000000 );
            if( div.rem > 0 )
                info_category_AddInfo( p_cat, _("Frame rate"), "%"PRId64".%06u",
diff --git a/src/misc/image.c b/src/misc/image.c
index 313d21386e..735801fcf2 100644
--- a/src/misc/image.c
+++ b/src/misc/image.c
@@ -729,8 +729,8 @@ static encoder_t *CreateEncoder( vlc_object_t *p_this, video_format_t *fmt_in,
             fmt_in->i_visible_width / fmt_in->i_sar_den / fmt_out->i_sar_num;
     }
 
-    p_enc->fmt_in.video.i_frame_rate = 25;
-    p_enc->fmt_in.video.i_frame_rate_base = 1;
+    p_enc->fmt_in.video.frame_rate.num = 25;
+    p_enc->fmt_in.video.frame_rate.den = 1;
 
     es_format_Init( &p_enc->fmt_out, VIDEO_ES, fmt_out->i_chroma );
     p_enc->fmt_out.video = *fmt_out;
-- 
2.11.1




More information about the vlc-devel mailing list