Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
dd521c46
Commit
dd521c46
authored
Apr 14, 2003
by
Christophe Massiot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* Implementation of a frame-dropping algorithm for the libmpeg2 plug-in
(incomplete).
parent
899ac5e2
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
699 additions
and
52 deletions
+699
-52
Makefile.am
Makefile.am
+2
-0
include/vlc_common.h
include/vlc_common.h
+2
-1
include/vout_synchro.h
include/vout_synchro.h
+89
-0
modules/codec/libmpeg2.c
modules/codec/libmpeg2.c
+80
-48
src/misc/modules.c
src/misc/modules.c
+2
-1
src/video_output/video_output.c
src/video_output/video_output.c
+2
-2
src/video_output/vout_synchro.c
src/video_output/vout_synchro.c
+522
-0
No files found.
Makefile.am
View file @
dd521c46
...
...
@@ -203,6 +203,7 @@ HEADERS_include = \
include/vlc_playlist.h
\
include/vlc_threads.h
\
include/vlc_threads_funcs.h
\
include/vout_synchro.h
\
include/win32_specific.h
\
include/osd.h
\
$(NULL)
...
...
@@ -387,6 +388,7 @@ SOURCES_libvlc_common = \
src/video_output/video_text.c
\
src/video_output/video_text.h
\
src/video_output/vout_subpictures.c
\
src/video_output/vout_synchro.c
\
src/audio_output/common.c
\
src/audio_output/dec.c
\
src/audio_output/filters.c
\
...
...
include/vlc_common.h
View file @
dd521c46
...
...
@@ -3,7 +3,7 @@
* Collection of useful common types and macros definitions
*****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: vlc_common.h,v 1.6
0 2003/04/13 20:00:20 fenrir
Exp $
* $Id: vlc_common.h,v 1.6
1 2003/04/14 22:22:32 massiot
Exp $
*
* Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr>
...
...
@@ -242,6 +242,7 @@ typedef struct picture_sys_t picture_sys_t;
typedef
struct
picture_heap_t
picture_heap_t
;
typedef
struct
subpicture_t
subpicture_t
;
typedef
struct
subpicture_sys_t
subpicture_sys_t
;
typedef
struct
vout_synchro_t
vout_synchro_t
;
/* Stream output */
typedef
struct
sout_instance_t
sout_instance_t
;
...
...
include/vout_synchro.h
0 → 100644
View file @
dd521c46
/*****************************************************************************
* vout_synchro.h: frame-dropping structures
*****************************************************************************
* Copyright (C) 1999-2003 VideoLAN
* $Id: vout_synchro.h,v 1.1 2003/04/14 22:22:32 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Jean-Marc Dressler <polux@via.ecp.fr>
* Stphane Borel <stef@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* vout_synchro_t : timers for the video synchro
*****************************************************************************/
#define MAX_PIC_AVERAGE 8
/* Read the discussion on top of vout_synchro.c for more information. */
struct
vout_synchro_t
{
VLC_COMMON_MEMBERS
vout_thread_t
*
p_vout
;
int
i_frame_rate
;
int
i_current_rate
;
/* date of the beginning of the decoding of the current picture */
mtime_t
decoding_start
;
/* stream properties */
unsigned
int
i_n_p
,
i_n_b
;
/* decoding values */
mtime_t
p_tau
[
4
];
/* average decoding durations */
unsigned
int
pi_meaningful
[
4
];
/* number of durations read */
/* and p_vout->render_time (read with p_vout->change_lock) */
/* stream context */
vlc_bool_t
i_nb_ref
;
/* Number of reference pictures */
unsigned
int
i_eta_p
,
i_eta_b
;
mtime_t
backward_pts
,
current_pts
;
int
i_current_period
;
/* period to add to the next picture */
int
i_backward_period
;
/* period to add after the next
* reference picture
* (backward_period * period / 2) */
/* statistics */
unsigned
int
i_trashed_pic
,
i_not_chosen_pic
,
i_pic
;
};
/* Pictures types */
#define I_CODING_TYPE 1
#define P_CODING_TYPE 2
#define B_CODING_TYPE 3
#define D_CODING_TYPE 4
/* MPEG-1 ONLY */
/* other values are reserved */
/* Structures */
#define TOP_FIELD 1
#define BOTTOM_FIELD 2
#define FRAME_STRUCTURE 3
/*****************************************************************************
* Prototypes
*****************************************************************************/
#define vout_SynchroInit(a,b,c) __vout_SynchroInit(VLC_OBJECT(a),b,c)
VLC_EXPORT
(
vout_synchro_t
*
,
__vout_SynchroInit
,
(
vlc_object_t
*
,
vout_thread_t
*
,
int
)
);
VLC_EXPORT
(
void
,
vout_SynchroRelease
,
(
vout_synchro_t
*
)
);
VLC_EXPORT
(
void
,
vout_SynchroReset
,
(
vout_synchro_t
*
)
);
VLC_EXPORT
(
vlc_bool_t
,
vout_SynchroChoose
,
(
vout_synchro_t
*
,
int
)
);
VLC_EXPORT
(
void
,
vout_SynchroTrash
,
(
vout_synchro_t
*
)
);
VLC_EXPORT
(
void
,
vout_SynchroDecode
,
(
vout_synchro_t
*
)
);
VLC_EXPORT
(
void
,
vout_SynchroEnd
,
(
vout_synchro_t
*
,
int
,
vlc_bool_t
)
);
VLC_EXPORT
(
mtime_t
,
vout_SynchroDate
,
(
vout_synchro_t
*
)
);
VLC_EXPORT
(
void
,
vout_SynchroNewPicture
,
(
vout_synchro_t
*
,
int
,
int
,
mtime_t
,
mtime_t
,
int
)
);
modules/codec/libmpeg2.c
View file @
dd521c46
...
...
@@ -2,7 +2,7 @@
* libmpeg2.c: mpeg2 video decoder module making use of libmpeg2.
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
* $Id: libmpeg2.c,v 1.
8 2003/04/07 17:35:01 gbazin
Exp $
* $Id: libmpeg2.c,v 1.
9 2003/04/14 22:22:32 massiot
Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
...
...
@@ -34,6 +34,8 @@
#include <mpeg2dec/mpeg2.h>
#include "vout_synchro.h"
/* Aspect ratio (ISO/IEC 13818-2 section 6.3.3, table 6-3) */
#define AR_SQUARE_PICTURE 1
/* square pixels */
#define AR_3_4_PICTURE 2
/* 3:4 picture (TV) */
...
...
@@ -60,11 +62,14 @@ typedef struct dec_thread_t
mtime_t
i_previous_pts
;
mtime_t
i_current_pts
;
mtime_t
i_period_remainder
;
int
i_current_rate
;
picture_t
*
p_picture_to_destroy
;
/*
* Output properties
*/
vout_thread_t
*
p_vout
;
vout_synchro_t
*
p_synchro
;
}
dec_thread_t
;
...
...
@@ -102,6 +107,7 @@ static int OpenDecoder( vlc_object_t *p_this )
p_fifo
->
pf_run
=
RunDecoder
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* RunDecoder: the libmpeg2 decoder
*****************************************************************************/
...
...
@@ -132,6 +138,7 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
p_dec
->
i_current_pts
=
0
;
p_dec
->
i_previous_pts
=
0
;
p_dec
->
i_period_remainder
=
0
;
p_dec
->
p_picture_to_destroy
=
NULL
;
/* Initialize decoder */
p_dec
->
p_mpeg2dec
=
mpeg2_init
();
...
...
@@ -163,6 +170,14 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
break
;
}
if
(
p_dec
->
p_pes
->
b_discontinuity
)
{
vout_SynchroReset
(
p_dec
->
p_synchro
);
if
(
p_dec
->
p_info
->
current_fbuf
!=
NULL
)
p_dec
->
p_picture_to_destroy
=
p_dec
->
p_info
->
current_fbuf
->
id
;
}
if
(
p_dec
->
p_pes
->
i_pts
)
{
mpeg2_pts
(
p_dec
->
p_mpeg2dec
,
...
...
@@ -170,6 +185,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
p_dec
->
i_previous_pts
=
p_dec
->
i_current_pts
;
p_dec
->
i_current_pts
=
p_dec
->
p_pes
->
i_pts
;
}
p_dec
->
i_current_rate
=
p_dec
->
p_pes
->
i_rate
;
p_data
=
p_dec
->
p_pes
->
p_first
;
}
...
...
@@ -187,6 +204,7 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
{
/* Initialize video output */
uint8_t
*
buf
[
3
];
buf
[
0
]
=
buf
[
1
]
=
buf
[
2
]
=
NULL
;
/* Check whether the input gives a particular aspect ratio */
if
(
p_dec
->
p_fifo
->
p_demux_data
...
...
@@ -231,76 +249,86 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
mpeg2_custom_fbuf
(
p_dec
->
p_mpeg2dec
,
1
);
/* Set the first 2 reference frames */
if
(
(
p_pic
=
GetNewPicture
(
p_dec
,
buf
))
==
NULL
)
break
;
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
p_pic
);
if
(
(
p_pic
=
GetNewPicture
(
p_dec
,
buf
))
==
NULL
)
break
;
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
p_pic
);
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
NULL
);
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
NULL
);
p_dec
->
p_synchro
=
vout_SynchroInit
(
p_dec
->
p_fifo
,
p_dec
->
p_vout
,
1000000
*
27
/
p_dec
->
p_info
->
sequence
->
frame_period
*
1001
);
}
break
;
case
STATE_PICTURE
:
{
uint8_t
*
buf
[
3
];
if
(
(
p_pic
=
GetNewPicture
(
p_dec
,
buf
))
==
NULL
)
break
;
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
p_pic
);
/* Store the date for the picture */
if
(
p_dec
->
p_info
->
current_picture
->
flags
&
PIC_FLAG_PTS
)
buf
[
0
]
=
buf
[
1
]
=
buf
[
2
]
=
NULL
;
vout_SynchroNewPicture
(
p_dec
->
p_synchro
,
p_dec
->
p_info
->
current_picture
->
flags
&
PIC_MASK_CODING_TYPE
,
p_dec
->
p_info
->
current_picture
->
nb_fields
,
(
p_dec
->
p_info
->
current_picture
->
flags
&
PIC_FLAG_PTS
)
?
(
(
p_dec
->
p_info
->
current_picture
->
pts
==
(
uint32_t
)
p_dec
->
i_current_pts
)
?
p_dec
->
i_current_pts
:
p_dec
->
i_previous_pts
)
:
0
,
0
,
p_dec
->
i_current_rate
);
if
(
!
vout_SynchroChoose
(
p_dec
->
p_synchro
,
p_dec
->
p_info
->
current_picture
->
flags
&
PIC_MASK_CODING_TYPE
)
)
{
mpeg2_skip
(
p_dec
->
p_mpeg2dec
,
1
);
vout_SynchroTrash
(
p_dec
->
p_synchro
);
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
NULL
);
}
else
{
p_pic
->
date
=
(
p_dec
->
p_info
->
current_picture
->
pts
==
(
uint32_t
)
p_dec
->
i_current_pts
)
?
p_dec
->
i_current_pts
:
p_dec
->
i_previous_pts
;
mpeg2_skip
(
p_dec
->
p_mpeg2dec
,
0
);
vout_SynchroDecode
(
p_dec
->
p_synchro
);
if
(
(
p_pic
=
GetNewPicture
(
p_dec
,
buf
))
==
NULL
)
break
;
mpeg2_set_buf
(
p_dec
->
p_mpeg2dec
,
buf
,
p_pic
);
}
}
break
;
/* pass-through */
case
STATE_END
:
case
STATE_SLICE
:
if
(
p_dec
->
p_info
->
display_fbuf
&&
p_dec
->
p_info
->
display_fbuf
->
id
)
{
p_pic
=
(
picture_t
*
)
p_dec
->
p_info
->
display_fbuf
->
id
;
/* Date the new picture */
if
(
p_dec
->
p_info
->
display_picture
->
flags
&
PIC_FLAG_PTS
)
{
p_dec
->
i_pts
=
p_pic
->
date
;
p_dec
->
i_period_remainder
=
0
;
}
else
if
(
p_pic
!=
NULL
)
{
p_dec
->
i_pts
+=
(
(
p_dec
->
p_info
->
sequence
->
frame_period
+
p_dec
->
i_period_remainder
)
/
27
);
p_dec
->
i_period_remainder
=
p_dec
->
p_info
->
sequence
->
frame_period
+
p_dec
->
i_period_remainder
-
(
p_dec
->
p_info
->
sequence
->
frame_period
+
p_dec
->
i_period_remainder
)
/
27
*
27
;
if
(
p_dec
->
p_picture_to_destroy
!=
p_pic
)
{
vout_SynchroEnd
(
p_dec
->
p_synchro
,
p_dec
->
p_info
->
display_picture
->
flags
&
PIC_MASK_CODING_TYPE
,
0
);
vout_DatePicture
(
p_dec
->
p_vout
,
p_pic
,
vout_SynchroDate
(
p_dec
->
p_synchro
)
);
vout_DisplayPicture
(
p_dec
->
p_vout
,
p_pic
);
}
else
{
p_dec
->
p_picture_to_destroy
=
NULL
;
vout_SynchroEnd
(
p_dec
->
p_synchro
,
p_dec
->
p_info
->
display_picture
->
flags
&
PIC_MASK_CODING_TYPE
,
1
);
vout_DestroyPicture
(
p_dec
->
p_vout
,
p_pic
);
}
}
vout_DatePicture
(
p_dec
->
p_vout
,
p_pic
,
p_dec
->
i_pts
);
vout_DisplayPicture
(
p_dec
->
p_vout
,
p_pic
);
/* Handle pulldown by adding some delay to the pts of the next
* picture. */
if
(
p_dec
->
p_info
->
display_picture
->
nb_fields
>
2
)
if
(
p_dec
->
p_info
->
discard_fbuf
&&
p_dec
->
p_info
->
discard_fbuf
->
id
)
{
int
i_repeat_fields
=
p_dec
->
p_info
->
display_picture
->
nb_fields
-
2
;
p_dec
->
i_pts
+=
(
(
p_dec
->
p_info
->
sequence
->
frame_period
+
p_dec
->
i_period_remainder
)
/
27
/
2
*
i_repeat_fields
);
p_dec
->
i_period_remainder
=
p_dec
->
p_info
->
sequence
->
frame_period
+
p_dec
->
i_period_remainder
-
(
p_dec
->
p_info
->
sequence
->
frame_period
+
p_dec
->
i_period_remainder
)
/
27
/
2
*
27
*
2
;
vout_UnlinkPicture
(
p_dec
->
p_vout
,
p_pic
);
}
}
break
;
case
STATE_INVALID
:
msg_Warn
(
p_dec
->
p_fifo
,
"Received STATE_INVALID"
);
break
;
default:
break
;
}
...
...
@@ -357,6 +385,9 @@ static void CloseDecoder( dec_thread_t * p_dec )
vout_Request
(
p_dec
->
p_fifo
,
p_dec
->
p_vout
,
0
,
0
,
0
,
0
);
}
if
(
p_dec
->
p_synchro
)
vout_SynchroRelease
(
p_dec
->
p_synchro
);
if
(
p_dec
->
p_mpeg2dec
)
mpeg2_close
(
p_dec
->
p_mpeg2dec
);
free
(
p_dec
);
...
...
@@ -380,6 +411,7 @@ static picture_t *GetNewPicture( dec_thread_t *p_dec, uint8_t **pp_buf )
}
if
(
p_pic
==
NULL
)
return
NULL
;
vout_LinkPicture
(
p_dec
->
p_vout
,
p_pic
);
pp_buf
[
0
]
=
p_pic
->
p
[
0
].
p_pixels
;
pp_buf
[
1
]
=
p_pic
->
p
[
1
].
p_pixels
;
...
...
src/misc/modules.c
View file @
dd521c46
...
...
@@ -2,7 +2,7 @@
* modules.c : Builtin and plugin modules management functions
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: modules.c,v 1.11
7 2003/03/25 15:38:14 gbazin
Exp $
* $Id: modules.c,v 1.11
8 2003/04/14 22:22:32 massiot
Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Ethan C. Baldridge <BaldridgeE@cadmus.com>
...
...
@@ -81,6 +81,7 @@
#include "video.h"
#include "video_output.h"
#include "vout_synchro.h"
#include "audio_output.h"
#include "aout_internal.h"
...
...
src/video_output/video_output.c
View file @
dd521c46
...
...
@@ -5,7 +5,7 @@
* thread, and destroy a previously oppened video output thread.
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
* $Id: video_output.c,v 1.21
7 2003/03/28 17:02:25 gbazin
Exp $
* $Id: video_output.c,v 1.21
8 2003/04/14 22:22:32 massiot
Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
...
...
@@ -638,7 +638,7 @@ static void RunThread( vout_thread_t *p_vout)
display_date
=
0
;
current_date
=
mdate
();
#if
def STATS
#if
0
p_vout->c_loops++;
if( !(p_vout->c_loops % VOUT_STATS_NB_LOOPS) )
{
...
...
src/video_output/vout_synchro.c
0 → 100644
View file @
dd521c46
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment