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
873069b3
Commit
873069b3
authored
Aug 18, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/codec/dmo/*: fixed video encoding.
parent
e97b748b
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
102 additions
and
12 deletions
+102
-12
modules/codec/dmo/dmo.c
modules/codec/dmo/dmo.c
+79
-11
modules/codec/dmo/dmo.h
modules/codec/dmo/dmo.h
+23
-1
No files found.
modules/codec/dmo/dmo.c
View file @
873069b3
...
...
@@ -21,7 +21,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#define DMO_DEBUG 1
/*****************************************************************************
* Preamble
*****************************************************************************/
...
...
@@ -49,6 +48,8 @@
#include "codecs.h"
#include "dmo.h"
//#define DMO_DEBUG 1
#ifdef LOADER
/* Not Needed */
long
CoInitialize
(
void
*
pvReserved
)
{
return
-
1
;
}
...
...
@@ -1003,6 +1004,8 @@ static int EncoderSetVideoType( encoder_t *p_enc, IMediaObject *p_dmo )
vih
.
rcSource
.
bottom
=
p_enc
->
fmt_in
.
video
.
i_height
;
vih
.
rcTarget
=
vih
.
rcSource
;
vih
.
AvgTimePerFrame
=
I64C
(
10000000
)
/
25
;
//FIXME
dmo_type
.
majortype
=
MEDIATYPE_Video
;
//dmo_type.subtype = MEDIASUBTYPE_RGB24;
dmo_type
.
subtype
=
MEDIASUBTYPE_I420
;
...
...
@@ -1052,7 +1055,61 @@ static int EncoderSetVideoType( encoder_t *p_enc, IMediaObject *p_dmo )
((
VIDEOINFOHEADER
*
)
dmo_type
.
pbFormat
)
->
dwBitRate
=
p_enc
->
fmt_out
.
i_bitrate
;
/* Get the private data for the codec */
while
(
1
)
{
IWMCodecPrivateData
*
p_privdata
;
VIDEOINFOHEADER
*
p_vih
;
uint8_t
*
p_data
=
0
;
uint32_t
i_data
=
0
,
i_vih
;
i_err
=
p_dmo
->
vt
->
QueryInterface
(
(
IUnknown
*
)
p_dmo
,
&
IID_IWMCodecPrivateData
,
(
void
**
)
&
p_privdata
);
if
(
i_err
)
break
;
i_err
=
p_privdata
->
vt
->
SetPartialOutputType
(
p_privdata
,
&
dmo_type
);
if
(
i_err
)
{
msg_Err
(
p_enc
,
"SetPartialOutputType() failed"
);
p_privdata
->
vt
->
Release
(
(
IUnknown
*
)
p_privdata
);
break
;
}
i_err
=
p_privdata
->
vt
->
GetPrivateData
(
p_privdata
,
NULL
,
&
i_data
);
if
(
i_err
)
{
msg_Err
(
p_enc
,
"GetPrivateData() failed"
);
p_privdata
->
vt
->
Release
(
(
IUnknown
*
)
p_privdata
);
break
;
}
p_data
=
malloc
(
i_data
);
i_err
=
p_privdata
->
vt
->
GetPrivateData
(
p_privdata
,
p_data
,
&
i_data
);
/* Update the media type with the private data */
i_vih
=
dmo_type
.
cbFormat
+
i_data
;
p_vih
=
CoTaskMemAlloc
(
i_vih
);
memcpy
(
p_vih
,
dmo_type
.
pbFormat
,
dmo_type
.
cbFormat
);
memcpy
(
((
uint8_t
*
)
p_vih
)
+
dmo_type
.
cbFormat
,
p_data
,
i_data
);
DMOFreeMediaType
(
&
dmo_type
);
dmo_type
.
pbFormat
=
p_vih
;
dmo_type
.
cbFormat
=
i_vih
;
msg_Dbg
(
p_enc
,
"found extra data: %i"
,
i_data
);
p_enc
->
fmt_out
.
i_extra
=
i_data
;
p_enc
->
fmt_out
.
p_extra
=
p_data
;
break
;
}
i_err
=
p_dmo
->
vt
->
SetOutputType
(
p_dmo
,
0
,
&
dmo_type
,
0
);
p_vih
=
(
VIDEOINFOHEADER
*
)
dmo_type
.
pbFormat
;
p_enc
->
fmt_out
.
video
.
i_width
=
p_enc
->
fmt_in
.
video
.
i_width
;
p_enc
->
fmt_out
.
video
.
i_height
=
p_enc
->
fmt_in
.
video
.
i_height
;
p_enc
->
fmt_out
.
video
.
i_aspect
=
VOUT_ASPECT_FACTOR
*
p_enc
->
fmt_out
.
video
.
i_width
/
p_enc
->
fmt_out
.
video
.
i_height
;
DMOFreeMediaType
(
&
dmo_type
);
if
(
i_err
)
{
...
...
@@ -1324,22 +1381,31 @@ static block_t *EncodeBlock( encoder_t *p_enc, void *p_data )
if
(
p_enc
->
fmt_out
.
i_cat
==
VIDEO_ES
)
{
/* Get picture data */
int
i_plane
,
i_line
,
i_width
,
i_src_stride
;
picture_t
*
p_pic
=
(
picture_t
*
)
p_data
;
uint8_t
*
p_dst
;
int
i_buffer
=
p_enc
->
fmt_in
.
video
.
i_width
*
p_enc
->
fmt_in
.
video
.
i_height
*
p_enc
->
fmt_in
.
video
.
i_bits_per_pixel
/
8
;
msg_Err
(
p_enc
,
"EncOpen bpp: %i, size: %i"
,
p_enc
->
fmt_in
.
video
.
i_bits_per_pixel
,
i_buffer
);
p_block_in
=
block_New
(
p_enc
,
i_buffer
);
// FIXME: Copy stride by stride;
#if 0
memcpy( p_block_in->p_buffer, p_pic->p->p_pixels,
p_block_in->i_buffer );
#else
memset
(
p_block_in
->
p_buffer
,
0
,
p_block_in
->
i_buffer
);
#endif
/* Copy picture stride by stride */
p_dst
=
p_block_in
->
p_buffer
;
for
(
i_plane
=
0
;
i_plane
<
p_pic
->
i_planes
;
i_plane
++
)
{
uint8_t
*
p_src
=
p_pic
->
p
[
i_plane
].
p_pixels
;
i_width
=
p_pic
->
p
[
i_plane
].
i_visible_pitch
;
i_src_stride
=
p_pic
->
p
[
i_plane
].
i_pitch
;
for
(
i_line
=
0
;
i_line
<
p_pic
->
p
[
i_plane
].
i_lines
;
i_line
++
)
{
p_enc
->
p_vlc
->
pf_memcpy
(
p_dst
,
p_src
,
i_width
);
p_dst
+=
i_width
;
p_src
+=
i_src_stride
;
}
}
i_pts
=
p_pic
->
date
;
}
...
...
@@ -1408,6 +1474,7 @@ static block_t *EncodeBlock( encoder_t *p_enc, void *p_data )
#endif
p_out
->
vt
->
Release
(
(
IUnknown
*
)
p_out
);
block_Release
(
p_block_out
);
return
p_chain
;
}
...
...
@@ -1417,6 +1484,7 @@ static block_t *EncodeBlock( encoder_t *p_enc, void *p_data )
msg_Dbg
(
p_enc
,
"ProcessOutput(): no output (i_buffer_out == 0)"
);
#endif
p_out
->
vt
->
Release
(
(
IUnknown
*
)
p_out
);
block_Release
(
p_block_out
);
return
p_chain
;
}
...
...
modules/codec/dmo/dmo.h
View file @
873069b3
...
...
@@ -23,6 +23,7 @@
static
const
GUID
IID_IUnknown
=
{
0x00000000
,
0x0000
,
0x0000
,
{
0xc0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x46
}};
static
const
GUID
IID_IClassFactory
=
{
0x00000001
,
0x0000
,
0x0000
,
{
0xc0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x46
}};
static
const
GUID
IID_IWMCodecPrivateData
=
{
0x73f0be8e
,
0x57f7
,
0x4f01
,
{
0xaa
,
0x66
,
0x9f
,
0x57
,
0x34
,
0xc
,
0xfe
,
0xe
}};
static
const
GUID
IID_IMediaObject
=
{
0xd8ad0f58
,
0x5494
,
0x4102
,
{
0x97
,
0xc5
,
0xec
,
0x79
,
0x8e
,
0x59
,
0xbc
,
0xf4
}};
static
const
GUID
IID_IMediaBuffer
=
{
0x59eff8b9
,
0x938c
,
0x4a26
,
{
0x82
,
0xf2
,
0x95
,
0xcb
,
0x84
,
0xcd
,
0xc8
,
0x37
}};
static
const
GUID
MEDIATYPE_Video
=
{
0x73646976
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
...
...
@@ -40,6 +41,7 @@ static const GUID MEDIASUBTYPE_RGB565 = {0xe436eb7b, 0x524f, 0x11ce, {0x9f, 0x53
#define IClassFactory IClassFactoryHack
typedef
struct
_IUnknown
IUnknown
;
typedef
struct
_IClassFactory
IClassFactory
;
typedef
struct
_IWMCodecPrivateData
IWMCodecPrivateData
;
typedef
struct
_IEnumDMO
IEnumDMO
;
typedef
struct
_IMediaBuffer
IMediaBuffer
;
typedef
struct
_IMediaObject
IMediaObject
;
...
...
@@ -131,6 +133,26 @@ typedef struct IClassFactory_vt
struct
_IClassFactory
{
IClassFactory_vt
*
vt
;
};
/*
* IWMCodecPrivateData interface
*/
typedef
struct
IWMCodecPrivateData_vt
{
long
(
STDCALL
*
QueryInterface
)(
IUnknown
*
This
,
const
GUID
*
riid
,
void
**
ppvObject
);
long
(
STDCALL
*
AddRef
)(
IUnknown
*
This
)
;
long
(
STDCALL
*
Release
)(
IUnknown
*
This
)
;
long
(
STDCALL
*
SetPartialOutputType
)(
IWMCodecPrivateData
*
This
,
DMO_MEDIA_TYPE
*
pmt
);
long
(
STDCALL
*
GetPrivateData
)(
IWMCodecPrivateData
*
This
,
uint8_t
*
pbData
,
uint32_t
*
pcbData
);
}
IWMCodecPrivateData_vt
;
struct
_IWMCodecPrivateData
{
IWMCodecPrivateData_vt
*
vt
;
};
/*
* IEnumDMO interface
*/
...
...
@@ -167,7 +189,7 @@ typedef struct IMediaBuffer_vt
long
(
STDCALL
*
SetLength
)(
IMediaBuffer
*
This
,
uint32_t
cbLength
);
long
(
STDCALL
*
GetMaxLength
)(
IMediaBuffer
*
This
,
uint32_t
*
pcbMaxLength
);
long
(
STDCALL
*
GetBufferAndLength
)(
IMediaBuffer
*
This
,
char
**
ppBuffer
,
uint32_t
*
pcbLength
);
char
**
ppBuffer
,
uint32_t
*
pcbLength
);
}
IMediaBuffer_vt
;
struct
_IMediaBuffer
{
IMediaBuffer_vt
*
vt
;
};
...
...
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