Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
f968ef92
Commit
f968ef92
authored
Mar 20, 2011
by
Philip Langdale
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CrystalHD: Refine heuristic logic.
parent
4ab57cff
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
28 additions
and
29 deletions
+28
-29
crystalhd.c
libavcodec/crystalhd.c
+28
-29
No files found.
libavcodec/crystalhd.c
View file @
f968ef92
...
...
@@ -512,8 +512,7 @@ static inline CopyRet copy_frame(AVCodecContext *avctx,
{
BC_STATUS
ret
;
BC_DTS_STATUS
decoder_status
;
uint8_t
confirmed_interlaced
;
uint8_t
ignore_interlaced
;
uint8_t
trust_interlaced
;
uint8_t
interlaced
;
CHDContext
*
priv
=
avctx
->
priv_data
;
...
...
@@ -561,50 +560,50 @@ static inline CopyRet copy_frame(AVCodecContext *avctx,
}
/*
*
If we're expecting a second field, or we know that the next
*
picture has the same number as the current picture, then we'r
e
*
definitely interlaced.
*
For most content, we can trust the interlaced flag returned
*
by the hardware, but sometimes we can't. These are th
e
*
conditions under which we can trust the flag:
*
* Note that this test can return false negatives if the hardware
* hasn't decoded the next picture or if there is a corruption in
* the stream. (In either case a 0 will be returned for the next
* picture number)
* 1) It's not h.264 content
* 2) The UNKNOWN_SRC flag is not set
* 3) We know we're expecting a second field
* 4) The hardware reports this picture and the next picture
* have the same picture number.
*
* Note that there can still be interlaced content that will
* fail this check, if the hardware hasn't decoded the next
* picture or if there is a corruption in the stream. (In either
* case a 0 will be returned for the next picture number)
*/
confirmed_interlaced
=
((
decoder_status
.
picNumFlags
&
~
0x40000000
)
==
output
->
PicInfo
.
picture_number
)
||
priv
->
need_second_field
;
trust_interlaced
=
avctx
->
codec
->
id
!=
CODEC_ID_H264
||
!
(
output
->
PicInfo
.
flags
&
VDEC_FLAG_UNKNOWN_SRC
)
||
priv
->
need_second_field
||
(
decoder_status
.
picNumFlags
&
~
0x40000000
)
==
output
->
PicInfo
.
picture_number
;
/*
* If we got a false negative for
confirmed
_interlaced on the first field,
* If we got a false negative for
trust
_interlaced on the first field,
* we will realise our mistake here when we see that the picture number is that
* of the previous picture. We cannot recover the frame and should discard the
* second field to keep the correct number of output frames.
*/
if
(
output
->
PicInfo
.
picture_number
==
priv
->
last_picture
&&
!
priv
->
need_second_field
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Incorrectly guessed progressie frame. Discarding second field
\n
"
);
"Incorrectly guessed progressi
v
e frame. Discarding second field
\n
"
);
/* Returning without providing a picture. */
return
RET_OK
;
}
/*
* Testing has, so far, shown that we can't trust the interlaced flag for
* H.264 content when VDEC_FLAG_UNKNOWN_SRC is set.
*/
ignore_interlaced
=
avctx
->
codec
->
id
==
CODEC_ID_H264
&&
(
output
->
PicInfo
.
flags
&
VDEC_FLAG_UNKNOWN_SRC
)
&&
(
pic_type
==
0
||
pic_type
==
PICT_FRAME
||
!
confirmed_interlaced
);
interlaced
=
(
output
->
PicInfo
.
flags
&
VDEC_FLAG_INTERLACED_SRC
)
&&
(
!
ignore_interlaced
||
confirmed_interlaced
);
if
(
ignore_interlaced
&&
(
decoder_status
.
picNumFlags
&
~
0x40000000
)
==
0
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
interlaced
=
(
output
->
PicInfo
.
flags
&
VDEC_FLAG_INTERLACED_SRC
)
&&
trust_interlaced
;
if
(
!
trust_interlaced
&&
(
decoder_status
.
picNumFlags
&
~
0x40000000
)
==
0
)
{
av_log
(
avctx
,
AV_LOG_VERBOSE
,
"Next picture number unknown. Assuming progressive frame.
\n
"
);
}
av_log
(
avctx
,
AV_LOG_VERBOSE
,
"Interlaced state: %d |
ignore
_interlaced %d
\n
"
,
interlaced
,
ignore
_interlaced
);
av_log
(
avctx
,
AV_LOG_VERBOSE
,
"Interlaced state: %d |
trust
_interlaced %d
\n
"
,
interlaced
,
trust
_interlaced
);
if
(
priv
->
pic
.
data
[
0
]
&&
!
priv
->
need_second_field
)
avctx
->
release_buffer
(
avctx
,
&
priv
->
pic
);
...
...
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