Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
a373f352
Commit
a373f352
authored
Nov 07, 2012
by
Peter Ross
Committed by
Michael Niedermayer
Nov 07, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wtvenc: produce seekable files
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
b89cd2a0
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
91 additions
and
20 deletions
+91
-20
wtvenc.c
libavformat/wtvenc.c
+71
-7
wtv
tests/ref/lavf/wtv
+1
-1
lavf_wtv
tests/ref/seek/lavf_wtv
+19
-12
No files found.
libavformat/wtvenc.c
View file @
a373f352
...
@@ -79,18 +79,44 @@ typedef struct {
...
@@ -79,18 +79,44 @@ typedef struct {
int
stream_id
;
int
stream_id
;
}
WtvChunkEntry
;
}
WtvChunkEntry
;
typedef
struct
{
int64_t
serial
;
int64_t
value
;
}
WtvSyncEntry
;
typedef
struct
{
typedef
struct
{
int64_t
timeline_start_pos
;
int64_t
timeline_start_pos
;
WtvFile
file
[
WTV_FILES
];
WtvFile
file
[
WTV_FILES
];
int64_t
serial
;
/** chunk serial number */
int64_t
serial
;
/** chunk serial number */
int64_t
last_chunk_pos
;
/** last chunk position */
int64_t
last_chunk_pos
;
/** last chunk position */
int64_t
last_timestamp_pos
;
/** last timestamp chunk position */
int64_t
first_index_pos
;
/** first index_chunk position */
WtvChunkEntry
index
[
MAX_NB_INDEX
];
WtvChunkEntry
index
[
MAX_NB_INDEX
];
int
nb_index
;
int
nb_index
;
int
first_video_flag
;
int
first_video_flag
;
int64_t
sync_pos
;
WtvSyncEntry
*
st_pairs
;
/* (serial, timestamp) pairs */
int
nb_st_pairs
;
WtvSyncEntry
*
sp_pairs
;
/* (serial, position) pairs */
int
nb_sp_pairs
;
int64_t
last_pts
;
int64_t
last_serial
;
}
WtvContext
;
}
WtvContext
;
static
void
add_serial_pair
(
WtvSyncEntry
**
list
,
int
*
count
,
int64_t
serial
,
int64_t
value
)
{
int
new_count
=
*
count
+
1
;
WtvSyncEntry
*
new_list
=
av_realloc
(
*
list
,
new_count
*
sizeof
(
WtvSyncEntry
));
if
(
!
new_list
)
return
;
new_list
[
*
count
]
=
(
WtvSyncEntry
){
serial
,
value
};
*
list
=
new_list
;
*
count
=
new_count
;
}
typedef
int
WTVHeaderWriteFunc
(
AVIOContext
*
pb
);
typedef
int
WTVHeaderWriteFunc
(
AVIOContext
*
pb
);
typedef
struct
{
typedef
struct
{
...
@@ -186,6 +212,9 @@ static void write_index(AVFormatContext *s)
...
@@ -186,6 +212,9 @@ static void write_index(AVFormatContext *s)
}
}
wctx
->
nb_index
=
0
;
// reset index
wctx
->
nb_index
=
0
;
// reset index
finish_chunk_noindex
(
s
);
finish_chunk_noindex
(
s
);
if
(
!
wctx
->
first_index_pos
)
wctx
->
first_index_pos
=
wctx
->
last_chunk_pos
;
}
}
static
void
finish_chunk
(
AVFormatContext
*
s
)
static
void
finish_chunk
(
AVFormatContext
*
s
)
...
@@ -277,12 +306,14 @@ static void write_sync(AVFormatContext *s)
...
@@ -277,12 +306,14 @@ static void write_sync(AVFormatContext *s)
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
WtvContext
*
wctx
=
s
->
priv_data
;
WtvContext
*
wctx
=
s
->
priv_data
;
int64_t
last_chunk_pos
=
wctx
->
last_chunk_pos
;
int64_t
last_chunk_pos
=
wctx
->
last_chunk_pos
;
wctx
->
sync_pos
=
avio_tell
(
pb
)
-
wctx
->
timeline_start_pos
;
write_chunk_header
(
s
,
&
ff_sync_guid
,
0x18
,
0
);
write_chunk_header
(
s
,
&
ff_sync_guid
,
0x18
,
0
);
write_pad
(
pb
,
24
);
avio_wl64
(
pb
,
wctx
->
first_index_pos
);
avio_wl64
(
pb
,
wctx
->
last_timestamp_pos
);
avio_wl64
(
pb
,
0
);
finish_chunk
(
s
);
finish_chunk
(
s
);
add_serial_pair
(
&
wctx
->
sp_pairs
,
&
wctx
->
nb_sp_pairs
,
wctx
->
serial
,
wctx
->
last_chunk_pos
);
wctx
->
last_chunk_pos
=
last_chunk_pos
;
wctx
->
last_chunk_pos
=
last_chunk_pos
;
}
}
...
@@ -317,6 +348,9 @@ static int write_header(AVFormatContext *s)
...
@@ -317,6 +348,9 @@ static int write_header(AVFormatContext *s)
int
i
,
pad
,
ret
;
int
i
,
pad
,
ret
;
AVStream
*
st
;
AVStream
*
st
;
wctx
->
last_chunk_pos
=
-
1
;
wctx
->
last_timestamp_pos
=
-
1
;
ff_put_guid
(
pb
,
&
ff_wtv_guid
);
ff_put_guid
(
pb
,
&
ff_wtv_guid
);
ff_put_guid
(
pb
,
&
sub_wtv_guid
);
ff_put_guid
(
pb
,
&
sub_wtv_guid
);
...
@@ -335,6 +369,7 @@ static int write_header(AVFormatContext *s)
...
@@ -335,6 +369,7 @@ static int write_header(AVFormatContext *s)
pad
=
(
1
<<
WTV_SECTOR_BITS
)
-
avio_tell
(
pb
);
pad
=
(
1
<<
WTV_SECTOR_BITS
)
-
avio_tell
(
pb
);
write_pad
(
pb
,
pad
);
write_pad
(
pb
,
pad
);
wctx
->
timeline_start_pos
=
avio_tell
(
pb
);
wctx
->
timeline_start_pos
=
avio_tell
(
pb
);
wctx
->
serial
=
1
;
wctx
->
serial
=
1
;
...
@@ -381,6 +416,8 @@ static void write_timestamp(AVFormatContext *s, AVPacket *pkt)
...
@@ -381,6 +416,8 @@ static void write_timestamp(AVFormatContext *s, AVPacket *pkt)
avio_wl64
(
pb
,
0
);
avio_wl64
(
pb
,
0
);
avio_wl64
(
pb
,
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
&&
(
pkt
->
flags
&
AV_PKT_FLAG_KEY
)
?
1
:
0
);
avio_wl64
(
pb
,
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
&&
(
pkt
->
flags
&
AV_PKT_FLAG_KEY
)
?
1
:
0
);
avio_wl64
(
pb
,
0
);
avio_wl64
(
pb
,
0
);
wctx
->
last_timestamp_pos
=
wctx
->
last_chunk_pos
;
}
}
static
int
write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
static
int
write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
...
@@ -388,6 +425,19 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
...
@@ -388,6 +425,19 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
WtvContext
*
wctx
=
s
->
priv_data
;
WtvContext
*
wctx
=
s
->
priv_data
;
/* emit sync chunk and 'timeline.table.0.entries.Event' record every 50 frames */
if
(
wctx
->
serial
-
(
wctx
->
nb_sp_pairs
?
wctx
->
sp_pairs
[
wctx
->
nb_sp_pairs
-
1
].
serial
:
0
)
>=
50
)
write_sync
(
s
);
/* emit 'table.0.entries.time' record every 500ms */
if
(
pkt
->
pts
!=
AV_NOPTS_VALUE
&&
pkt
->
pts
-
(
wctx
->
nb_st_pairs
?
wctx
->
st_pairs
[
wctx
->
nb_st_pairs
-
1
].
value
:
0
)
>=
5000000
)
add_serial_pair
(
&
wctx
->
st_pairs
,
&
wctx
->
nb_st_pairs
,
wctx
->
serial
,
pkt
->
pts
);
if
(
pkt
->
pts
!=
AV_NOPTS_VALUE
&&
pkt
->
pts
>
wctx
->
last_pts
)
{
wctx
->
last_pts
=
pkt
->
pts
;
wctx
->
last_serial
=
wctx
->
serial
;
}
// write timestamp chunk
// write timestamp chunk
write_timestamp
(
s
,
pkt
);
write_timestamp
(
s
,
pkt
);
...
@@ -520,10 +570,24 @@ static void write_table_entries_events(AVFormatContext *s)
...
@@ -520,10 +570,24 @@ static void write_table_entries_events(AVFormatContext *s)
{
{
AVIOContext
*
pb
=
s
->
pb
;
AVIOContext
*
pb
=
s
->
pb
;
WtvContext
*
wctx
=
s
->
priv_data
;
WtvContext
*
wctx
=
s
->
priv_data
;
int
i
;
for
(
i
=
0
;
i
<
wctx
->
nb_sp_pairs
;
i
++
)
{
avio_wl64
(
pb
,
wctx
->
sp_pairs
[
i
].
serial
);
avio_wl64
(
pb
,
wctx
->
sp_pairs
[
i
].
value
);
}
}
//FIXME: output frame_nb, position pairs.
static
void
write_table_entries_time
(
AVFormatContext
*
s
)
//We only set the first sync_chunk position here.
{
avio_wl64
(
pb
,
0x2
);
avio_wl64
(
pb
,
wctx
->
sync_pos
);
AVIOContext
*
pb
=
s
->
pb
;
WtvContext
*
wctx
=
s
->
priv_data
;
int
i
;
for
(
i
=
0
;
i
<
wctx
->
nb_st_pairs
;
i
++
)
{
avio_wl64
(
pb
,
wctx
->
st_pairs
[
i
].
value
);
avio_wl64
(
pb
,
wctx
->
st_pairs
[
i
].
serial
);
}
avio_wl64
(
pb
,
wctx
->
last_pts
);
avio_wl64
(
pb
,
wctx
->
last_serial
);
}
}
static
void
write_tag
(
AVIOContext
*
pb
,
const
char
*
key
,
const
char
*
value
)
static
void
write_tag
(
AVIOContext
*
pb
,
const
char
*
key
,
const
char
*
value
)
...
@@ -648,7 +712,7 @@ static int write_trailer(AVFormatContext *s)
...
@@ -648,7 +712,7 @@ static int write_trailer(AVFormatContext *s)
return
-
1
;
return
-
1
;
start_pos
=
avio_tell
(
pb
);
start_pos
=
avio_tell
(
pb
);
//FIXME: output timestamp, frame_nb pairs here.
write_table_entries_time
(
s
);
if
(
finish_file
(
s
,
WTV_TABLE_0_ENTRIES_TIME
,
start_pos
)
<
0
)
if
(
finish_file
(
s
,
WTV_TABLE_0_ENTRIES_TIME
,
start_pos
)
<
0
)
return
-
1
;
return
-
1
;
...
...
tests/ref/lavf/wtv
View file @
a373f352
dcb02f245dca4597704cbfc06e7eb543
*./tests/data/lavf/lavf.wtv
345516d3a03fd239c62e5e7257c9f4a2
*./tests/data/lavf/lavf.wtv
413696 ./tests/data/lavf/lavf.wtv
413696 ./tests/data/lavf/lavf.wtv
./tests/data/lavf/lavf.wtv CRC=0xcc2dc628
./tests/data/lavf/lavf.wtv CRC=0xcc2dc628
tests/ref/seek/lavf_wtv
View file @
a373f352
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st:-1 flags:0 ts:-1.000000
ret: 0 st:-1 flags:0 ts:-1.000000
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st:-1 flags:1 ts: 1.894167
ret: 0 st:-1 flags:1 ts: 1.894167
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret: 0 st: 0 flags:0 ts: 0.788334
ret: 0 st: 0 flags:0 ts: 0.788334
ret: 0 st: 1 flags:1 dts: 0.
772766 pts: 0.772766 pos: 320800
size: 209
ret: 0 st: 1 flags:1 dts: 0.
694399 pts: 0.694399 pos: 294744
size: 209
ret: 0 st: 0 flags:1 ts:-0.317499
ret: 0 st: 0 flags:1 ts:-0.317499
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st: 1 flags:0 ts: 2.576668
ret:-1 st: 1 flags:0 ts: 2.576668
ret:-1 st: 1 flags:1 ts: 1.470835
ret: 0 st: 1 flags:1 ts: 1.470835
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret: 0 st:-1 flags:0 ts: 0.365002
ret: 0 st:-1 flags:0 ts: 0.365002
ret: 0 st: 1 flags:1 dts:
0.380930 pts: 0.380930 pos: 167000 size: 209
ret: 0 st: 1 flags:1 dts:
-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st:-1 flags:1 ts:-0.740831
ret: 0 st:-1 flags:1 ts:-0.740831
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st: 0 flags:0 ts: 2.153336
ret:-1 st: 0 flags:0 ts: 2.153336
ret:-1 st: 0 flags:1 ts: 1.047503
ret: 0 st: 0 flags:1 ts: 1.047503
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret: 0 st: 1 flags:0 ts:-0.058330
ret: 0 st: 1 flags:0 ts:-0.058330
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st: 1 flags:1 ts: 2.835837
ret: 0 st: 1 flags:1 ts: 2.835837
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret:-1 st:-1 flags:0 ts: 1.730004
ret:-1 st:-1 flags:0 ts: 1.730004
ret: 0 st:-1 flags:1 ts: 0.624171
ret: 0 st:-1 flags:1 ts: 0.624171
ret: 0 st: 1 flags:1 dts:
0.616032 pts: 0.616032 pos: 266144 size: 209
ret: 0 st: 1 flags:1 dts:
-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 0 flags:0 ts:-0.481662
ret: 0 st: 0 flags:0 ts:-0.481662
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st: 0 flags:1 ts: 2.412505
ret: 0 st: 0 flags:1 ts: 2.412505
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret:-1 st: 1 flags:0 ts: 1.306672
ret:-1 st: 1 flags:0 ts: 1.306672
ret: 0 st: 1 flags:1 ts: 0.200839
ret: 0 st: 1 flags:1 ts: 0.200839
ret: 0 st: 1 flags:1 dts: 0.224195 pts: 0.224195 pos: 112904 size: 209
ret: 0 st: 1 flags:1 dts: 0.224195 pts: 0.224195 pos: 112904 size: 209
ret: 0 st:-1 flags:0 ts:-0.904994
ret: 0 st:-1 flags:0 ts:-0.904994
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st:-1 flags:1 ts: 1.989173
ret: 0 st:-1 flags:1 ts: 1.989173
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret: 0 st: 0 flags:0 ts: 0.883340
ret: 0 st: 0 flags:0 ts: 0.883340
ret: 0 st: 1 flags:1 dts: 0.
903379 pts: 0.903379 pos: 357632
size: 209
ret: 0 st: 1 flags:1 dts: 0.
694399 pts: 0.694399 pos: 294744
size: 209
ret: 0 st: 0 flags:1 ts:-0.222493
ret: 0 st: 0 flags:1 ts:-0.222493
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret:-1 st: 1 flags:0 ts: 2.671674
ret:-1 st: 1 flags:0 ts: 2.671674
ret:-1 st: 1 flags:1 ts: 1.565841
ret: 0 st: 1 flags:1 ts: 1.565841
ret: 0 st: 1 flags:1 dts: 0.694399 pts: 0.694399 pos: 294744 size: 209
ret: 0 st:-1 flags:0 ts: 0.460008
ret: 0 st:-1 flags:0 ts: 0.460008
ret: 0 st: 1 flags:1 dts:
0.459297 pts: 0.459297 pos: 205328 size: 209
ret: 0 st: 1 flags:1 dts:
-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st:-1 flags:1 ts:-0.645825
ret: 0 st:-1 flags:1 ts:-0.645825
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
ret: 0 st: 1 flags:1 dts:-0.010907 pts:-0.010907 pos: 26344 size: 208
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