Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
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-gpu
Commits
149e4ec2
Commit
149e4ec2
authored
Dec 20, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* src/misc/image.c: implemented ImageWrite() and ImageWriteUrl().
parent
152dbb02
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
173 additions
and
7 deletions
+173
-7
src/misc/image.c
src/misc/image.c
+173
-7
No files found.
src/misc/image.c
View file @
149e4ec2
...
...
@@ -46,6 +46,9 @@ static int ImageWriteUrl( image_handler_t *, picture_t *,
static
decoder_t
*
CreateDecoder
(
vlc_object_t
*
,
video_format_t
*
);
static
void
DeleteDecoder
(
decoder_t
*
);
static
encoder_t
*
CreateEncoder
(
vlc_object_t
*
,
video_format_t
*
,
video_format_t
*
);
static
void
DeleteEncoder
(
encoder_t
*
);
static
filter_t
*
CreateFilter
(
vlc_object_t
*
,
es_format_t
*
,
video_format_t
*
);
static
void
DeleteFilter
(
filter_t
*
);
...
...
@@ -81,6 +84,7 @@ void image_HandlerDelete( image_handler_t *p_image )
if
(
!
p_image
)
return
;
if
(
p_image
->
p_dec
)
DeleteDecoder
(
p_image
->
p_dec
);
if
(
p_image
->
p_enc
)
DeleteEncoder
(
p_image
->
p_enc
);
if
(
p_image
->
p_filter
)
DeleteFilter
(
p_image
->
p_filter
);
free
(
p_image
);
...
...
@@ -215,18 +219,125 @@ static picture_t *ImageReadUrl( image_handler_t *p_image, const char *psz_url,
*
*/
void
PicRelease
(
picture_t
*
p_pic
){};
static
block_t
*
ImageWrite
(
image_handler_t
*
p_image
,
picture_t
*
p_pic
,
video_format_t
*
p_fmt_in
,
video_format_t
*
p_fmt_out
)
{
return
NULL
;
block_t
*
p_block
;
void
(
*
pf_release
)(
picture_t
*
);
/* Check if we can reuse the current encoder */
if
(
p_image
->
p_enc
&&
(
p_image
->
p_enc
->
fmt_out
.
i_codec
!=
p_fmt_out
->
i_chroma
||
p_image
->
p_enc
->
fmt_out
.
video
.
i_width
!=
p_fmt_out
->
i_width
||
p_image
->
p_enc
->
fmt_out
.
video
.
i_height
!=
p_fmt_out
->
i_height
)
)
{
DeleteEncoder
(
p_image
->
p_enc
);
p_image
->
p_enc
=
0
;
}
/* Start an encoder */
if
(
!
p_image
->
p_enc
)
{
p_image
->
p_enc
=
CreateEncoder
(
p_image
->
p_parent
,
p_fmt_in
,
p_fmt_out
);
if
(
!
p_image
->
p_enc
)
return
NULL
;
}
/* Check if we need chroma conversion or resizing */
if
(
p_image
->
p_enc
->
fmt_in
.
video
.
i_chroma
!=
p_fmt_in
->
i_chroma
||
p_image
->
p_enc
->
fmt_in
.
video
.
i_width
!=
p_fmt_in
->
i_width
||
p_image
->
p_enc
->
fmt_in
.
video
.
i_height
!=
p_fmt_in
->
i_height
)
{
picture_t
*
p_pif
;
if
(
p_image
->
p_filter
)
if
(
p_image
->
p_filter
->
fmt_in
.
video
.
i_chroma
!=
p_fmt_in
->
i_chroma
||
p_image
->
p_filter
->
fmt_out
.
video
.
i_chroma
!=
p_image
->
p_enc
->
fmt_in
.
video
.
i_chroma
)
{
/* We need to restart a new filter */
DeleteFilter
(
p_image
->
p_filter
);
p_image
->
p_filter
=
0
;
}
/* Start a filter */
if
(
!
p_image
->
p_filter
)
{
es_format_t
fmt_in
;
es_format_Init
(
&
fmt_in
,
VIDEO_ES
,
p_fmt_in
->
i_chroma
);
fmt_in
.
video
=
*
p_fmt_in
;
p_image
->
p_filter
=
CreateFilter
(
p_image
->
p_parent
,
&
fmt_in
,
&
p_image
->
p_enc
->
fmt_in
.
video
);
if
(
!
p_image
->
p_filter
)
{
return
NULL
;
}
}
else
{
/* Filters should handle on-the-fly size changes */
p_image
->
p_filter
->
fmt_in
.
i_codec
=
p_fmt_in
->
i_chroma
;
p_image
->
p_filter
->
fmt_out
.
video
=
*
p_fmt_in
;
p_image
->
p_filter
->
fmt_out
.
i_codec
=
p_image
->
p_enc
->
fmt_in
.
i_codec
;
p_image
->
p_filter
->
fmt_out
.
video
=
p_image
->
p_enc
->
fmt_in
.
video
;
}
pf_release
=
p_pic
->
pf_release
;
p_pic
->
pf_release
=
PicRelease
;
/* Small hack */
p_pif
=
p_image
->
p_filter
->
pf_video_filter
(
p_image
->
p_filter
,
p_pic
);
p_pic
->
pf_release
=
pf_release
;
p_pic
=
p_pif
;
}
p_block
=
p_image
->
p_enc
->
pf_encode_video
(
p_image
->
p_enc
,
p_pic
);
if
(
!
p_block
)
{
msg_Dbg
(
p_image
->
p_parent
,
"no image encoded"
);
return
0
;
}
return
p_block
;
}
static
int
ImageWriteUrl
(
image_handler_t
*
p_image
,
picture_t
*
p_pic
,
video_format_t
*
p_fmt_in
,
video_format_t
*
p_fmt_out
,
const
char
*
psz_url
)
{
return
VLC_EGENERIC
;
block_t
*
p_block
;
FILE
*
file
;
if
(
!
p_fmt_out
->
i_chroma
)
{
/* Try to guess format from file name */
p_fmt_out
->
i_chroma
=
Ext2Fourcc
(
psz_url
);
}
file
=
fopen
(
psz_url
,
"wb"
);
if
(
!
file
)
{
msg_Dbg
(
p_image
->
p_parent
,
"could not open file %s for writing"
,
psz_url
);
return
VLC_EGENERIC
;
}
p_block
=
ImageWrite
(
p_image
,
p_pic
,
p_fmt_in
,
p_fmt_out
);
if
(
p_block
)
{
fwrite
(
p_block
->
p_buffer
,
sizeof
(
char
),
p_block
->
i_buffer
,
file
);
block_Release
(
p_block
);
}
fclose
(
file
);
return
p_block
?
VLC_SUCCESS
:
VLC_EGENERIC
;
}
/**
...
...
@@ -334,7 +445,6 @@ static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
static
decoder_t
*
CreateDecoder
(
vlc_object_t
*
p_this
,
video_format_t
*
fmt
)
{
decoder_t
*
p_dec
;
static
es_format_t
null_es_format
=
{
0
};
p_dec
=
vlc_object_create
(
p_this
,
VLC_OBJECT_DECODER
);
if
(
p_dec
==
NULL
)
...
...
@@ -344,11 +454,9 @@ static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt )
}
p_dec
->
p_module
=
NULL
;
es_format_
Copy
(
&
p_dec
->
fmt_in
,
&
null_es_format
);
es_format_
Copy
(
&
p_dec
->
fmt_out
,
&
null_es_format
);
es_format_
Init
(
&
p_dec
->
fmt_in
,
VIDEO_ES
,
fmt
->
i_chroma
);
es_format_
Init
(
&
p_dec
->
fmt_out
,
VIDEO_ES
,
0
);
p_dec
->
fmt_in
.
video
=
*
fmt
;
p_dec
->
fmt_in
.
i_cat
=
VIDEO_ES
;
p_dec
->
fmt_in
.
i_codec
=
fmt
->
i_chroma
;
p_dec
->
b_pace_control
=
VLC_TRUE
;
p_dec
->
pf_vout_buffer_new
=
video_new_buffer
;
...
...
@@ -385,6 +493,64 @@ static void DeleteDecoder( decoder_t * p_dec )
vlc_object_destroy
(
p_dec
);
}
static
encoder_t
*
CreateEncoder
(
vlc_object_t
*
p_this
,
video_format_t
*
fmt_in
,
video_format_t
*
fmt_out
)
{
encoder_t
*
p_enc
;
p_enc
=
vlc_object_create
(
p_this
,
VLC_OBJECT_ENCODER
);
if
(
p_enc
==
NULL
)
{
msg_Err
(
p_this
,
"out of memory"
);
return
NULL
;
}
p_enc
->
p_module
=
NULL
;
es_format_Init
(
&
p_enc
->
fmt_in
,
VIDEO_ES
,
fmt_in
->
i_chroma
);
p_enc
->
fmt_in
.
video
=
*
fmt_in
;
if
(
fmt_out
->
i_width
>
0
&&
fmt_out
->
i_height
>
0
)
{
p_enc
->
fmt_in
.
video
.
i_width
=
fmt_out
->
i_width
;
p_enc
->
fmt_in
.
video
.
i_height
=
fmt_out
->
i_height
;
}
p_enc
->
fmt_in
.
video
.
i_frame_rate
=
25
;
p_enc
->
fmt_in
.
video
.
i_frame_rate_base
=
1
;
es_format_Init
(
&
p_enc
->
fmt_out
,
VIDEO_ES
,
fmt_out
->
i_chroma
);
p_enc
->
fmt_out
.
video
=
*
fmt_out
;
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
;
vlc_object_attach
(
p_enc
,
p_this
);
/* Find a suitable decoder module */
p_enc
->
p_module
=
module_Need
(
p_enc
,
"encoder"
,
0
,
0
);
if
(
!
p_enc
->
p_module
)
{
msg_Err
(
p_enc
,
"no suitable encoder module for fourcc `%4.4s'.
\n
"
"VLC probably does not support this image format."
,
(
char
*
)
&
p_enc
->
fmt_out
.
i_codec
);
DeleteEncoder
(
p_enc
);
return
NULL
;
}
p_enc
->
fmt_in
.
video
.
i_chroma
=
p_enc
->
fmt_in
.
i_codec
;
return
p_enc
;
}
static
void
DeleteEncoder
(
encoder_t
*
p_enc
)
{
vlc_object_detach
(
p_enc
);
if
(
p_enc
->
p_module
)
module_Unneed
(
p_enc
,
p_enc
->
p_module
);
es_format_Clean
(
&
p_enc
->
fmt_in
);
es_format_Clean
(
&
p_enc
->
fmt_out
);
vlc_object_destroy
(
p_enc
);
}
static
filter_t
*
CreateFilter
(
vlc_object_t
*
p_this
,
es_format_t
*
p_fmt_in
,
video_format_t
*
p_fmt_out
)
{
...
...
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