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
16c22122
Commit
16c22122
authored
Jul 26, 2013
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
h264: K&R formatting cosmetics
parent
96668944
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
154 additions
and
144 deletions
+154
-144
h264.c
libavcodec/h264.c
+154
-144
No files found.
libavcodec/h264.c
View file @
16c22122
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
* @author Michael Niedermayer <michaelni@gmx.at>
* @author Michael Niedermayer <michaelni@gmx.at>
*/
*/
#include "libavutil/avassert.h"
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
#include "internal.h"
#include "internal.h"
#include "cabac.h"
#include "cabac.h"
...
@@ -43,7 +44,6 @@
...
@@ -43,7 +44,6 @@
#include "svq3.h"
#include "svq3.h"
#include "thread.h"
#include "thread.h"
#include "vdpau_internal.h"
#include "vdpau_internal.h"
#include "libavutil/avassert.h"
// #undef NDEBUG
// #undef NDEBUG
#include <assert.h>
#include <assert.h>
...
@@ -100,7 +100,7 @@ static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
...
@@ -100,7 +100,7 @@ static void h264_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
int
(
*
mv
)[
2
][
4
][
2
],
int
(
*
mv
)[
2
][
4
][
2
],
int
mb_x
,
int
mb_y
,
int
mb_intra
,
int
mb_skipped
)
int
mb_x
,
int
mb_y
,
int
mb_intra
,
int
mb_skipped
)
{
{
H264Context
*
h
=
opaque
;
H264Context
*
h
=
opaque
;
h
->
mb_x
=
mb_x
;
h
->
mb_x
=
mb_x
;
h
->
mb_y
=
mb_y
;
h
->
mb_y
=
mb_y
;
...
@@ -132,7 +132,7 @@ void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
...
@@ -132,7 +132,7 @@ void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
const
int
field_pic
=
h
->
picture_structure
!=
PICT_FRAME
;
const
int
field_pic
=
h
->
picture_structure
!=
PICT_FRAME
;
if
(
field_pic
)
{
if
(
field_pic
)
{
height
<<=
1
;
height
<<=
1
;
y
<<=
1
;
y
<<=
1
;
}
}
height
=
FFMIN
(
height
,
avctx
->
height
-
y
);
height
=
FFMIN
(
height
,
avctx
->
height
-
y
);
...
@@ -146,7 +146,7 @@ void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
...
@@ -146,7 +146,7 @@ void ff_h264_draw_horiz_band(H264Context *h, int y, int height)
int
i
;
int
i
;
if
(
cur
->
f
.
pict_type
==
AV_PICTURE_TYPE_B
||
h
->
low_delay
||
if
(
cur
->
f
.
pict_type
==
AV_PICTURE_TYPE_B
||
h
->
low_delay
||
(
avctx
->
slice_flags
&
SLICE_FLAG_CODED_ORDER
))
(
avctx
->
slice_flags
&
SLICE_FLAG_CODED_ORDER
))
src
=
&
cur
->
f
;
src
=
&
cur
->
f
;
else
if
(
last
)
else
if
(
last
)
src
=
&
last
->
f
;
src
=
&
last
->
f
;
...
@@ -213,7 +213,6 @@ static int ref_picture(H264Context *h, Picture *dst, Picture *src)
...
@@ -213,7 +213,6 @@ static int ref_picture(H264Context *h, Picture *dst, Picture *src)
if
(
ret
<
0
)
if
(
ret
<
0
)
goto
fail
;
goto
fail
;
dst
->
qscale_table_buf
=
av_buffer_ref
(
src
->
qscale_table_buf
);
dst
->
qscale_table_buf
=
av_buffer_ref
(
src
->
qscale_table_buf
);
dst
->
mb_type_buf
=
av_buffer_ref
(
src
->
mb_type_buf
);
dst
->
mb_type_buf
=
av_buffer_ref
(
src
->
mb_type_buf
);
if
(
!
dst
->
qscale_table_buf
||
!
dst
->
mb_type_buf
)
if
(
!
dst
->
qscale_table_buf
||
!
dst
->
mb_type_buf
)
...
@@ -221,7 +220,7 @@ static int ref_picture(H264Context *h, Picture *dst, Picture *src)
...
@@ -221,7 +220,7 @@ static int ref_picture(H264Context *h, Picture *dst, Picture *src)
dst
->
qscale_table
=
src
->
qscale_table
;
dst
->
qscale_table
=
src
->
qscale_table
;
dst
->
mb_type
=
src
->
mb_type
;
dst
->
mb_type
=
src
->
mb_type
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
dst
->
motion_val_buf
[
i
]
=
av_buffer_ref
(
src
->
motion_val_buf
[
i
]);
dst
->
motion_val_buf
[
i
]
=
av_buffer_ref
(
src
->
motion_val_buf
[
i
]);
dst
->
ref_index_buf
[
i
]
=
av_buffer_ref
(
src
->
ref_index_buf
[
i
]);
dst
->
ref_index_buf
[
i
]
=
av_buffer_ref
(
src
->
ref_index_buf
[
i
]);
if
(
!
dst
->
motion_val_buf
[
i
]
||
!
dst
->
ref_index_buf
[
i
])
if
(
!
dst
->
motion_val_buf
[
i
]
||
!
dst
->
ref_index_buf
[
i
])
...
@@ -243,15 +242,15 @@ static int ref_picture(H264Context *h, Picture *dst, Picture *src)
...
@@ -243,15 +242,15 @@ static int ref_picture(H264Context *h, Picture *dst, Picture *src)
memcpy
(
dst
->
ref_poc
,
src
->
ref_poc
,
sizeof
(
src
->
ref_poc
));
memcpy
(
dst
->
ref_poc
,
src
->
ref_poc
,
sizeof
(
src
->
ref_poc
));
memcpy
(
dst
->
ref_count
,
src
->
ref_count
,
sizeof
(
src
->
ref_count
));
memcpy
(
dst
->
ref_count
,
src
->
ref_count
,
sizeof
(
src
->
ref_count
));
dst
->
poc
=
src
->
poc
;
dst
->
poc
=
src
->
poc
;
dst
->
frame_num
=
src
->
frame_num
;
dst
->
frame_num
=
src
->
frame_num
;
dst
->
mmco_reset
=
src
->
mmco_reset
;
dst
->
mmco_reset
=
src
->
mmco_reset
;
dst
->
pic_id
=
src
->
pic_id
;
dst
->
pic_id
=
src
->
pic_id
;
dst
->
long_ref
=
src
->
long_ref
;
dst
->
long_ref
=
src
->
long_ref
;
dst
->
mbaff
=
src
->
mbaff
;
dst
->
mbaff
=
src
->
mbaff
;
dst
->
field_picture
=
src
->
field_picture
;
dst
->
field_picture
=
src
->
field_picture
;
dst
->
needs_realloc
=
src
->
needs_realloc
;
dst
->
needs_realloc
=
src
->
needs_realloc
;
dst
->
reference
=
src
->
reference
;
dst
->
reference
=
src
->
reference
;
return
0
;
return
0
;
fail:
fail:
...
@@ -259,7 +258,6 @@ fail:
...
@@ -259,7 +258,6 @@ fail:
return
ret
;
return
ret
;
}
}
static
int
alloc_scratch_buffers
(
H264Context
*
h
,
int
linesize
)
static
int
alloc_scratch_buffers
(
H264Context
*
h
,
int
linesize
)
{
{
int
alloc_size
=
FFALIGN
(
FFABS
(
linesize
)
+
32
,
32
);
int
alloc_size
=
FFALIGN
(
FFABS
(
linesize
)
+
32
,
32
);
...
@@ -503,19 +501,21 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
...
@@ -503,19 +501,21 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
length
--
;
length
--
;
#define STARTCODE_TEST \
#define STARTCODE_TEST \
if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
if (src[i + 2] != 3) { \
if (src[i + 2] != 3) { \
/* startcode, so we must be past the end */
\
/* startcode, so we must be past the end */
\
length = i; \
length = i; \
} \
} \
break; \
break; \
}
}
#if HAVE_FAST_UNALIGNED
#if HAVE_FAST_UNALIGNED
#define FIND_FIRST_ZERO \
#define FIND_FIRST_ZERO \
if (i > 0 && !src[i]) \
if (i > 0 && !src[i]) \
i--; \
i--; \
while (src[i]) \
while (src[i]) \
i++
i++
#if HAVE_FAST_64BIT
#if HAVE_FAST_64BIT
for
(
i
=
0
;
i
+
1
<
length
;
i
+=
9
)
{
for
(
i
=
0
;
i
+
1
<
length
;
i
+=
9
)
{
if
(
!
((
~
AV_RN64A
(
src
+
i
)
&
if
(
!
((
~
AV_RN64A
(
src
+
i
)
&
...
@@ -583,8 +583,8 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
...
@@ -583,8 +583,8 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
}
}
while
(
si
<
length
)
while
(
si
<
length
)
dst
[
di
++
]
=
src
[
si
++
];
dst
[
di
++
]
=
src
[
si
++
];
nsc:
nsc:
memset
(
dst
+
di
,
0
,
FF_INPUT_BUFFER_PADDING_SIZE
);
memset
(
dst
+
di
,
0
,
FF_INPUT_BUFFER_PADDING_SIZE
);
*
dst_length
=
di
;
*
dst_length
=
di
;
...
@@ -616,12 +616,12 @@ static int decode_rbsp_trailing(H264Context *h, const uint8_t *src)
...
@@ -616,12 +616,12 @@ static int decode_rbsp_trailing(H264Context *h, const uint8_t *src)
static
inline
int
get_lowest_part_list_y
(
H264Context
*
h
,
Picture
*
pic
,
int
n
,
static
inline
int
get_lowest_part_list_y
(
H264Context
*
h
,
Picture
*
pic
,
int
n
,
int
height
,
int
y_offset
,
int
list
)
int
height
,
int
y_offset
,
int
list
)
{
{
int
raw_my
=
h
->
mv_cache
[
list
][
scan8
[
n
]][
1
];
int
raw_my
=
h
->
mv_cache
[
list
][
scan8
[
n
]][
1
];
int
filter_height_up
=
(
raw_my
&
3
)
?
2
:
0
;
int
filter_height_up
=
(
raw_my
&
3
)
?
2
:
0
;
int
filter_height_down
=
(
raw_my
&
3
)
?
3
:
0
;
int
filter_height_down
=
(
raw_my
&
3
)
?
3
:
0
;
int
full_my
=
(
raw_my
>>
2
)
+
y_offset
;
int
full_my
=
(
raw_my
>>
2
)
+
y_offset
;
int
top
=
full_my
-
filter_height_up
;
int
top
=
full_my
-
filter_height_up
;
int
bottom
=
full_my
+
filter_height_down
+
height
;
int
bottom
=
full_my
+
filter_height_down
+
height
;
return
FFMAX
(
abs
(
top
),
bottom
);
return
FFMAX
(
abs
(
top
),
bottom
);
}
}
...
@@ -641,7 +641,7 @@ static inline void get_lowest_part_y(H264Context *h, int refs[2][48], int n,
...
@@ -641,7 +641,7 @@ static inline void get_lowest_part_y(H264Context *h, int refs[2][48], int n,
// Error resilience puts the current picture in the ref list.
// Error resilience puts the current picture in the ref list.
// Don't try to wait on these as it will cause a deadlock.
// Don't try to wait on these as it will cause a deadlock.
// Fields can wait on each other, though.
// Fields can wait on each other, though.
if
(
ref
->
tf
.
progress
->
data
!=
h
->
cur_pic
.
tf
.
progress
->
data
||
if
(
ref
->
tf
.
progress
->
data
!=
h
->
cur_pic
.
tf
.
progress
->
data
||
(
ref
->
reference
&
3
)
!=
h
->
picture_structure
)
{
(
ref
->
reference
&
3
)
!=
h
->
picture_structure
)
{
my
=
get_lowest_part_list_y
(
h
,
ref
,
n
,
height
,
y_offset
,
0
);
my
=
get_lowest_part_list_y
(
h
,
ref
,
n
,
height
,
y_offset
,
0
);
if
(
refs
[
0
][
ref_n
]
<
0
)
if
(
refs
[
0
][
ref_n
]
<
0
)
...
@@ -1204,8 +1204,8 @@ static void init_dequant_tables(H264Context *h)
...
@@ -1204,8 +1204,8 @@ static void init_dequant_tables(H264Context *h)
int
ff_h264_alloc_tables
(
H264Context
*
h
)
int
ff_h264_alloc_tables
(
H264Context
*
h
)
{
{
const
int
big_mb_num
=
h
->
mb_stride
*
(
h
->
mb_height
+
1
);
const
int
big_mb_num
=
h
->
mb_stride
*
(
h
->
mb_height
+
1
);
const
int
row_mb_num
=
h
->
mb_stride
*
2
*
h
->
avctx
->
thread_count
;
const
int
row_mb_num
=
h
->
mb_stride
*
2
*
h
->
avctx
->
thread_count
;
int
x
,
y
,
i
;
int
x
,
y
,
i
;
FF_ALLOCZ_OR_GOTO
(
h
->
avctx
,
h
->
intra4x4_pred_mode
,
FF_ALLOCZ_OR_GOTO
(
h
->
avctx
,
h
->
intra4x4_pred_mode
,
...
@@ -1335,7 +1335,7 @@ static int context_init(H264Context *h)
...
@@ -1335,7 +1335,7 @@ static int context_init(H264Context *h)
er
->
mb_index2xy
[
x
+
y
*
h
->
mb_width
]
=
x
+
y
*
h
->
mb_stride
;
er
->
mb_index2xy
[
x
+
y
*
h
->
mb_width
]
=
x
+
y
*
h
->
mb_stride
;
er
->
mb_index2xy
[
h
->
mb_height
*
h
->
mb_width
]
=
(
h
->
mb_height
-
1
)
*
er
->
mb_index2xy
[
h
->
mb_height
*
h
->
mb_width
]
=
(
h
->
mb_height
-
1
)
*
h
->
mb_stride
+
h
->
mb_width
;
h
->
mb_stride
+
h
->
mb_width
;
FF_ALLOCZ_OR_GOTO
(
h
->
avctx
,
er
->
error_status_table
,
FF_ALLOCZ_OR_GOTO
(
h
->
avctx
,
er
->
error_status_table
,
mb_array_size
*
sizeof
(
uint8_t
),
fail
);
mb_array_size
*
sizeof
(
uint8_t
),
fail
);
...
@@ -1458,7 +1458,7 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
...
@@ -1458,7 +1458,7 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
ff_h264_decode_init_vlc
();
ff_h264_decode_init_vlc
();
h
->
pixel_shift
=
0
;
h
->
pixel_shift
=
0
;
h
->
sps
.
bit_depth_luma
=
avctx
->
bits_per_raw_sample
=
8
;
h
->
sps
.
bit_depth_luma
=
avctx
->
bits_per_raw_sample
=
8
;
h
->
thread_context
[
0
]
=
h
;
h
->
thread_context
[
0
]
=
h
;
...
@@ -1493,8 +1493,8 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
...
@@ -1493,8 +1493,8 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
#undef REBASE_PICTURE
#undef REBASE_PICTURE
#define REBASE_PICTURE(pic, new_ctx, old_ctx) \
#define REBASE_PICTURE(pic, new_ctx, old_ctx) \
((pic && pic >= old_ctx->DPB && \
((pic && pic >= old_ctx->DPB && \
pic < old_ctx->DPB + MAX_PICTURE_COUNT) ? \
pic < old_ctx->DPB + MAX_PICTURE_COUNT) ?
\
&new_ctx->DPB[pic - old_ctx->DPB] : NULL)
&new_ctx->DPB[pic - old_ctx->DPB] : NULL)
static
void
copy_picture_range
(
Picture
**
to
,
Picture
**
from
,
int
count
,
static
void
copy_picture_range
(
Picture
**
to
,
Picture
**
from
,
int
count
,
H264Context
*
new_base
,
H264Context
*
new_base
,
...
@@ -1560,10 +1560,10 @@ static int decode_update_thread_context(AVCodecContext *dst,
...
@@ -1560,10 +1560,10 @@ static int decode_update_thread_context(AVCodecContext *dst,
return
0
;
return
0
;
if
(
inited
&&
if
(
inited
&&
(
h
->
width
!=
h1
->
width
||
(
h
->
width
!=
h1
->
width
||
h
->
height
!=
h1
->
height
||
h
->
height
!=
h1
->
height
||
h
->
mb_width
!=
h1
->
mb_width
||
h
->
mb_width
!=
h1
->
mb_width
||
h
->
mb_height
!=
h1
->
mb_height
||
h
->
mb_height
!=
h1
->
mb_height
||
h
->
sps
.
bit_depth_luma
!=
h1
->
sps
.
bit_depth_luma
||
h
->
sps
.
bit_depth_luma
!=
h1
->
sps
.
bit_depth_luma
||
h
->
sps
.
chroma_format_idc
!=
h1
->
sps
.
chroma_format_idc
||
h
->
sps
.
chroma_format_idc
!=
h1
->
sps
.
chroma_format_idc
||
h
->
sps
.
colorspace
!=
h1
->
sps
.
colorspace
))
{
h
->
sps
.
colorspace
!=
h1
->
sps
.
colorspace
))
{
...
@@ -1619,12 +1619,12 @@ static int decode_update_thread_context(AVCodecContext *dst,
...
@@ -1619,12 +1619,12 @@ static int decode_update_thread_context(AVCodecContext *dst,
avcodec_get_frame_defaults
(
&
h
->
cur_pic
.
f
);
avcodec_get_frame_defaults
(
&
h
->
cur_pic
.
f
);
h
->
cur_pic
.
tf
.
f
=
&
h
->
cur_pic
.
f
;
h
->
cur_pic
.
tf
.
f
=
&
h
->
cur_pic
.
f
;
h
->
avctx
=
dst
;
h
->
avctx
=
dst
;
h
->
DPB
=
NULL
;
h
->
DPB
=
NULL
;
h
->
qscale_table_pool
=
NULL
;
h
->
qscale_table_pool
=
NULL
;
h
->
mb_type_pool
=
NULL
;
h
->
mb_type_pool
=
NULL
;
h
->
ref_index_pool
=
NULL
;
h
->
ref_index_pool
=
NULL
;
h
->
motion_val_pool
=
NULL
;
h
->
motion_val_pool
=
NULL
;
if
(
ff_h264_alloc_tables
(
h
)
<
0
)
{
if
(
ff_h264_alloc_tables
(
h
)
<
0
)
{
av_log
(
dst
,
AV_LOG_ERROR
,
"Could not allocate memory for h264
\n
"
);
av_log
(
dst
,
AV_LOG_ERROR
,
"Could not allocate memory for h264
\n
"
);
...
@@ -1663,7 +1663,7 @@ static int decode_update_thread_context(AVCodecContext *dst,
...
@@ -1663,7 +1663,7 @@ static int decode_update_thread_context(AVCodecContext *dst,
return
ret
;
return
ret
;
}
}
h
->
cur_pic_ptr
=
REBASE_PICTURE
(
h1
->
cur_pic_ptr
,
h
,
h1
);
h
->
cur_pic_ptr
=
REBASE_PICTURE
(
h1
->
cur_pic_ptr
,
h
,
h1
);
unref_picture
(
h
,
&
h
->
cur_pic
);
unref_picture
(
h
,
&
h
->
cur_pic
);
if
((
ret
=
ref_picture
(
h
,
&
h
->
cur_pic
,
&
h1
->
cur_pic
))
<
0
)
if
((
ret
=
ref_picture
(
h
,
&
h
->
cur_pic
,
&
h1
->
cur_pic
))
<
0
)
return
ret
;
return
ret
;
...
@@ -1750,7 +1750,7 @@ static int h264_frame_start(H264Context *h)
...
@@ -1750,7 +1750,7 @@ static int h264_frame_start(H264Context *h)
}
}
pic
=
&
h
->
DPB
[
i
];
pic
=
&
h
->
DPB
[
i
];
pic
->
reference
=
h
->
droppable
?
0
:
h
->
picture_structure
;
pic
->
reference
=
h
->
droppable
?
0
:
h
->
picture_structure
;
pic
->
f
.
coded_picture_number
=
h
->
coded_picture_number
++
;
pic
->
f
.
coded_picture_number
=
h
->
coded_picture_number
++
;
pic
->
field_picture
=
h
->
picture_structure
!=
PICT_FRAME
;
pic
->
field_picture
=
h
->
picture_structure
!=
PICT_FRAME
;
/*
/*
...
@@ -1832,7 +1832,7 @@ static void decode_postinit(H264Context *h, int setup_finished)
...
@@ -1832,7 +1832,7 @@ static void decode_postinit(H264Context *h, int setup_finished)
int
i
,
pics
,
out_of_order
,
out_idx
;
int
i
,
pics
,
out_of_order
,
out_idx
;
int
invalid
=
0
,
cnt
=
0
;
int
invalid
=
0
,
cnt
=
0
;
h
->
cur_pic_ptr
->
f
.
pict_type
=
h
->
pict_type
;
h
->
cur_pic_ptr
->
f
.
pict_type
=
h
->
pict_type
;
if
(
h
->
next_output_pic
)
if
(
h
->
next_output_pic
)
return
;
return
;
...
@@ -2254,8 +2254,8 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
...
@@ -2254,8 +2254,8 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
if
(
IS_INTRA4x4
(
mb_type
))
{
if
(
IS_INTRA4x4
(
mb_type
))
{
if
(
IS_8x8DCT
(
mb_type
))
{
if
(
IS_8x8DCT
(
mb_type
))
{
if
(
transform_bypass
)
{
if
(
transform_bypass
)
{
idct_dc_add
=
idct_dc_add
=
idct_add
=
h
->
h264dsp
.
h264_add_pixels8_clear
;
idct_add
=
h
->
h264dsp
.
h264_add_pixels8_clear
;
}
else
{
}
else
{
idct_dc_add
=
h
->
h264dsp
.
h264_idct8_dc_add
;
idct_dc_add
=
h
->
h264dsp
.
h264_idct8_dc_add
;
idct_add
=
h
->
h264dsp
.
h264_idct8_add
;
idct_add
=
h
->
h264dsp
.
h264_idct8_add
;
...
@@ -2338,7 +2338,8 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
...
@@ -2338,7 +2338,8 @@ static av_always_inline void hl_decode_mb_predict_luma(H264Context *h,
0
*
16
,
1
*
16
,
4
*
16
,
5
*
16
,
0
*
16
,
1
*
16
,
4
*
16
,
5
*
16
,
2
*
16
,
3
*
16
,
6
*
16
,
7
*
16
,
2
*
16
,
3
*
16
,
6
*
16
,
7
*
16
,
8
*
16
,
9
*
16
,
12
*
16
,
13
*
16
,
8
*
16
,
9
*
16
,
12
*
16
,
13
*
16
,
10
*
16
,
11
*
16
,
14
*
16
,
15
*
16
};
10
*
16
,
11
*
16
,
14
*
16
,
15
*
16
};
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
dctcoef_set
(
h
->
mb
+
(
p
*
256
<<
pixel_shift
),
dctcoef_set
(
h
->
mb
+
(
p
*
256
<<
pixel_shift
),
pixel_shift
,
dc_mapping
[
i
],
pixel_shift
,
dc_mapping
[
i
],
...
@@ -2438,7 +2439,8 @@ void ff_h264_hl_decode_mb(H264Context *h)
...
@@ -2438,7 +2439,8 @@ void ff_h264_hl_decode_mb(H264Context *h)
{
{
const
int
mb_xy
=
h
->
mb_xy
;
const
int
mb_xy
=
h
->
mb_xy
;
const
int
mb_type
=
h
->
cur_pic
.
mb_type
[
mb_xy
];
const
int
mb_type
=
h
->
cur_pic
.
mb_type
[
mb_xy
];
int
is_complex
=
CONFIG_SMALL
||
h
->
is_complex
||
IS_INTRA_PCM
(
mb_type
)
||
h
->
qscale
==
0
;
int
is_complex
=
CONFIG_SMALL
||
h
->
is_complex
||
IS_INTRA_PCM
(
mb_type
)
||
h
->
qscale
==
0
;
if
(
CHROMA444
(
h
))
{
if
(
CHROMA444
(
h
))
{
if
(
is_complex
||
h
->
pixel_shift
)
if
(
is_complex
||
h
->
pixel_shift
)
...
@@ -2495,7 +2497,7 @@ static int pred_weight_table(H264Context *h)
...
@@ -2495,7 +2497,7 @@ static int pred_weight_table(H264Context *h)
h
->
chroma_weight
[
i
][
list
][
j
][
1
]
=
get_se_golomb
(
&
h
->
gb
);
h
->
chroma_weight
[
i
][
list
][
j
][
1
]
=
get_se_golomb
(
&
h
->
gb
);
if
(
h
->
chroma_weight
[
i
][
list
][
j
][
0
]
!=
chroma_def
||
if
(
h
->
chroma_weight
[
i
][
list
][
j
][
0
]
!=
chroma_def
||
h
->
chroma_weight
[
i
][
list
][
j
][
1
]
!=
0
)
{
h
->
chroma_weight
[
i
][
list
][
j
][
1
]
!=
0
)
{
h
->
use_weight_chroma
=
1
;
h
->
use_weight_chroma
=
1
;
h
->
chroma_weight_flag
[
list
]
=
1
;
h
->
chroma_weight_flag
[
list
]
=
1
;
}
}
}
}
...
@@ -2537,7 +2539,7 @@ static void implicit_weight_table(H264Context *h, int field)
...
@@ -2537,7 +2539,7 @@ static void implicit_weight_table(H264Context *h, int field)
}
}
if
(
h
->
ref_count
[
0
]
==
1
&&
h
->
ref_count
[
1
]
==
1
&&
!
FRAME_MBAFF
(
h
)
&&
if
(
h
->
ref_count
[
0
]
==
1
&&
h
->
ref_count
[
1
]
==
1
&&
!
FRAME_MBAFF
(
h
)
&&
h
->
ref_list
[
0
][
0
].
poc
+
h
->
ref_list
[
1
][
0
].
poc
==
2
*
cur_poc
)
{
h
->
ref_list
[
0
][
0
].
poc
+
h
->
ref_list
[
1
][
0
].
poc
==
2
*
cur_poc
)
{
h
->
use_weight
=
0
;
h
->
use_weight
=
0
;
h
->
use_weight_chroma
=
0
;
h
->
use_weight_chroma
=
0
;
return
;
return
;
}
}
...
@@ -2599,7 +2601,7 @@ static void flush_change(H264Context *h)
...
@@ -2599,7 +2601,7 @@ static void flush_change(H264Context *h)
int
i
;
int
i
;
for
(
i
=
0
;
i
<
MAX_DELAYED_PIC_COUNT
;
i
++
)
for
(
i
=
0
;
i
<
MAX_DELAYED_PIC_COUNT
;
i
++
)
h
->
last_pocs
[
i
]
=
INT_MIN
;
h
->
last_pocs
[
i
]
=
INT_MIN
;
h
->
outputed_poc
=
h
->
next_outputed_poc
=
INT_MIN
;
h
->
outputed_poc
=
h
->
next_outputed_poc
=
INT_MIN
;
h
->
prev_interlaced_frame
=
1
;
h
->
prev_interlaced_frame
=
1
;
idr
(
h
);
idr
(
h
);
if
(
h
->
cur_pic_ptr
)
if
(
h
->
cur_pic_ptr
)
...
@@ -2654,9 +2656,11 @@ int ff_init_poc(H264Context *h, int pic_field_poc[2], int *pic_poc)
...
@@ -2654,9 +2656,11 @@ int ff_init_poc(H264Context *h, int pic_field_poc[2], int *pic_poc)
if
(
h
->
sps
.
poc_type
==
0
)
{
if
(
h
->
sps
.
poc_type
==
0
)
{
const
int
max_poc_lsb
=
1
<<
h
->
sps
.
log2_max_poc_lsb
;
const
int
max_poc_lsb
=
1
<<
h
->
sps
.
log2_max_poc_lsb
;
if
(
h
->
poc_lsb
<
h
->
prev_poc_lsb
&&
h
->
prev_poc_lsb
-
h
->
poc_lsb
>=
max_poc_lsb
/
2
)
if
(
h
->
poc_lsb
<
h
->
prev_poc_lsb
&&
h
->
prev_poc_lsb
-
h
->
poc_lsb
>=
max_poc_lsb
/
2
)
h
->
poc_msb
=
h
->
prev_poc_msb
+
max_poc_lsb
;
h
->
poc_msb
=
h
->
prev_poc_msb
+
max_poc_lsb
;
else
if
(
h
->
poc_lsb
>
h
->
prev_poc_lsb
&&
h
->
prev_poc_lsb
-
h
->
poc_lsb
<
-
max_poc_lsb
/
2
)
else
if
(
h
->
poc_lsb
>
h
->
prev_poc_lsb
&&
h
->
prev_poc_lsb
-
h
->
poc_lsb
<
-
max_poc_lsb
/
2
)
h
->
poc_msb
=
h
->
prev_poc_msb
-
max_poc_lsb
;
h
->
poc_msb
=
h
->
prev_poc_msb
-
max_poc_lsb
;
else
else
h
->
poc_msb
=
h
->
prev_poc_msb
;
h
->
poc_msb
=
h
->
prev_poc_msb
;
...
@@ -2996,7 +3000,7 @@ static int init_dimensions(H264Context *h)
...
@@ -2996,7 +3000,7 @@ static int init_dimensions(H264Context *h)
av_log
(
h
->
avctx
,
AV_LOG_WARNING
,
"Ignoring cropping information.
\n
"
);
av_log
(
h
->
avctx
,
AV_LOG_WARNING
,
"Ignoring cropping information.
\n
"
);
h
->
sps
.
crop_bottom
=
h
->
sps
.
crop_top
=
h
->
sps
.
crop_right
=
h
->
sps
.
crop_left
=
0
;
h
->
sps
.
crop_bottom
=
h
->
sps
.
crop_top
=
h
->
sps
.
crop_right
=
h
->
sps
.
crop_left
=
0
;
h
->
sps
.
crop
=
0
;
h
->
sps
.
crop
=
0
;
width
=
h
->
width
;
width
=
h
->
width
;
height
=
h
->
height
;
height
=
h
->
height
;
...
@@ -3034,7 +3038,7 @@ static int h264_slice_header_init(H264Context *h, int reinit)
...
@@ -3034,7 +3038,7 @@ static int h264_slice_header_init(H264Context *h, int reinit)
if
(
reinit
)
if
(
reinit
)
free_tables
(
h
,
0
);
free_tables
(
h
,
0
);
h
->
first_field
=
0
;
h
->
first_field
=
0
;
h
->
prev_interlaced_frame
=
1
;
h
->
prev_interlaced_frame
=
1
;
init_scan_tables
(
h
);
init_scan_tables
(
h
);
...
@@ -3064,33 +3068,33 @@ static int h264_slice_header_init(H264Context *h, int reinit)
...
@@ -3064,33 +3068,33 @@ static int h264_slice_header_init(H264Context *h, int reinit)
}
else
{
}
else
{
for
(
i
=
1
;
i
<
h
->
slice_context_count
;
i
++
)
{
for
(
i
=
1
;
i
<
h
->
slice_context_count
;
i
++
)
{
H264Context
*
c
;
H264Context
*
c
;
c
=
h
->
thread_context
[
i
]
=
av_mallocz
(
sizeof
(
H264Context
));
c
=
h
->
thread_context
[
i
]
=
av_mallocz
(
sizeof
(
H264Context
));
c
->
avctx
=
h
->
avctx
;
c
->
avctx
=
h
->
avctx
;
c
->
dsp
=
h
->
dsp
;
c
->
dsp
=
h
->
dsp
;
c
->
vdsp
=
h
->
vdsp
;
c
->
vdsp
=
h
->
vdsp
;
c
->
h264dsp
=
h
->
h264dsp
;
c
->
h264dsp
=
h
->
h264dsp
;
c
->
h264qpel
=
h
->
h264qpel
;
c
->
h264qpel
=
h
->
h264qpel
;
c
->
h264chroma
=
h
->
h264chroma
;
c
->
h264chroma
=
h
->
h264chroma
;
c
->
sps
=
h
->
sps
;
c
->
sps
=
h
->
sps
;
c
->
pps
=
h
->
pps
;
c
->
pps
=
h
->
pps
;
c
->
pixel_shift
=
h
->
pixel_shift
;
c
->
pixel_shift
=
h
->
pixel_shift
;
c
->
width
=
h
->
width
;
c
->
width
=
h
->
width
;
c
->
height
=
h
->
height
;
c
->
height
=
h
->
height
;
c
->
linesize
=
h
->
linesize
;
c
->
linesize
=
h
->
linesize
;
c
->
uvlinesize
=
h
->
uvlinesize
;
c
->
uvlinesize
=
h
->
uvlinesize
;
c
->
chroma_x_shift
=
h
->
chroma_x_shift
;
c
->
chroma_x_shift
=
h
->
chroma_x_shift
;
c
->
chroma_y_shift
=
h
->
chroma_y_shift
;
c
->
chroma_y_shift
=
h
->
chroma_y_shift
;
c
->
qscale
=
h
->
qscale
;
c
->
qscale
=
h
->
qscale
;
c
->
droppable
=
h
->
droppable
;
c
->
droppable
=
h
->
droppable
;
c
->
data_partitioning
=
h
->
data_partitioning
;
c
->
data_partitioning
=
h
->
data_partitioning
;
c
->
low_delay
=
h
->
low_delay
;
c
->
low_delay
=
h
->
low_delay
;
c
->
mb_width
=
h
->
mb_width
;
c
->
mb_width
=
h
->
mb_width
;
c
->
mb_height
=
h
->
mb_height
;
c
->
mb_height
=
h
->
mb_height
;
c
->
mb_stride
=
h
->
mb_stride
;
c
->
mb_stride
=
h
->
mb_stride
;
c
->
mb_num
=
h
->
mb_num
;
c
->
mb_num
=
h
->
mb_num
;
c
->
flags
=
h
->
flags
;
c
->
flags
=
h
->
flags
;
c
->
workaround_bugs
=
h
->
workaround_bugs
;
c
->
workaround_bugs
=
h
->
workaround_bugs
;
c
->
pict_type
=
h
->
pict_type
;
c
->
pict_type
=
h
->
pict_type
;
init_scan_tables
(
c
);
init_scan_tables
(
c
);
clone_tables
(
c
,
h
,
i
);
clone_tables
(
c
,
h
,
i
);
...
@@ -3250,7 +3254,6 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3250,7 +3254,6 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
(
h
->
width
!=
h
->
avctx
->
coded_width
||
(
h
->
width
!=
h
->
avctx
->
coded_width
||
h
->
height
!=
h
->
avctx
->
coded_height
||
h
->
height
!=
h
->
avctx
->
coded_height
||
needs_reinit
))
{
needs_reinit
))
{
if
(
h
!=
h0
)
{
if
(
h
!=
h0
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"changing width/height on "
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"changing width/height on "
"slice %d
\n
"
,
h0
->
current_slice
+
1
);
"slice %d
\n
"
,
h0
->
current_slice
+
1
);
...
@@ -3407,7 +3410,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3407,7 +3410,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
if
(
h264_frame_start
(
h
)
<
0
)
if
(
h264_frame_start
(
h
)
<
0
)
return
-
1
;
return
-
1
;
h
->
prev_frame_num
++
;
h
->
prev_frame_num
++
;
h
->
prev_frame_num
%=
1
<<
h
->
sps
.
log2_max_frame_num
;
h
->
prev_frame_num
%=
1
<<
h
->
sps
.
log2_max_frame_num
;
h
->
cur_pic_ptr
->
frame_num
=
h
->
prev_frame_num
;
h
->
cur_pic_ptr
->
frame_num
=
h
->
prev_frame_num
;
ff_thread_report_progress
(
&
h
->
cur_pic_ptr
->
tf
,
INT_MAX
,
0
);
ff_thread_report_progress
(
&
h
->
cur_pic_ptr
->
tf
,
INT_MAX
,
0
);
ff_thread_report_progress
(
&
h
->
cur_pic_ptr
->
tf
,
INT_MAX
,
1
);
ff_thread_report_progress
(
&
h
->
cur_pic_ptr
->
tf
,
INT_MAX
,
1
);
...
@@ -3417,17 +3420,22 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3417,17 +3420,22 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
if
(
ff_h264_execute_ref_pic_marking
(
h
,
h
->
mmco
,
h
->
mmco_index
)
<
0
&&
if
(
ff_h264_execute_ref_pic_marking
(
h
,
h
->
mmco
,
h
->
mmco_index
)
<
0
&&
(
h
->
avctx
->
err_recognition
&
AV_EF_EXPLODE
))
(
h
->
avctx
->
err_recognition
&
AV_EF_EXPLODE
))
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
/* Error concealment: if a ref is missing, copy the previous ref in its place.
/* Error concealment: If a ref is missing, copy the previous ref
* FIXME: avoiding a memcpy would be nice, but ref handling makes many assumptions
* in its place.
* about there being no actual duplicates.
* FIXME: Avoiding a memcpy would be nice, but ref handling makes
* FIXME: this doesn't copy padding for out-of-frame motion vectors. Given we're
* many assumptions about there being no actual duplicates.
* concealing a lost frame, this probably isn't noticeable by comparison, but it should
* FIXME: This does not copy padding for out-of-frame motion
* be fixed. */
* vectors. Given we are concealing a lost frame, this probably
* is not noticeable by comparison, but it should be fixed. */
if
(
h
->
short_ref_count
)
{
if
(
h
->
short_ref_count
)
{
if
(
prev
)
{
if
(
prev
)
{
av_image_copy
(
h
->
short_ref
[
0
]
->
f
.
data
,
h
->
short_ref
[
0
]
->
f
.
linesize
,
av_image_copy
(
h
->
short_ref
[
0
]
->
f
.
data
,
(
const
uint8_t
**
)
prev
->
f
.
data
,
prev
->
f
.
linesize
,
h
->
short_ref
[
0
]
->
f
.
linesize
,
h
->
avctx
->
pix_fmt
,
h
->
mb_width
*
16
,
h
->
mb_height
*
16
);
(
const
uint8_t
**
)
prev
->
f
.
data
,
prev
->
f
.
linesize
,
h
->
avctx
->
pix_fmt
,
h
->
mb_width
*
16
,
h
->
mb_height
*
16
);
h
->
short_ref
[
0
]
->
poc
=
prev
->
poc
+
2
;
h
->
short_ref
[
0
]
->
poc
=
prev
->
poc
+
2
;
}
}
h
->
short_ref
[
0
]
->
frame_num
=
h
->
prev_frame_num
;
h
->
short_ref
[
0
]
->
frame_num
=
h
->
prev_frame_num
;
...
@@ -3486,7 +3494,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3486,7 +3494,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
return
-
1
;
return
-
1
;
}
}
h
->
resync_mb_x
=
h
->
mb_x
=
first_mb_in_slice
%
h
->
mb_width
;
h
->
resync_mb_x
=
h
->
mb_x
=
first_mb_in_slice
%
h
->
mb_width
;
h
->
resync_mb_y
=
h
->
mb_y
=
(
first_mb_in_slice
/
h
->
mb_width
)
<<
FIELD_OR_MBAFF_PICTURE
(
h
);
h
->
resync_mb_y
=
h
->
mb_y
=
(
first_mb_in_slice
/
h
->
mb_width
)
<<
FIELD_OR_MBAFF_PICTURE
(
h
);
if
(
h
->
picture_structure
==
PICT_BOTTOM_FIELD
)
if
(
h
->
picture_structure
==
PICT_BOTTOM_FIELD
)
h
->
resync_mb_y
=
h
->
mb_y
=
h
->
mb_y
+
1
;
h
->
resync_mb_y
=
h
->
mb_y
=
h
->
mb_y
+
1
;
assert
(
h
->
mb_y
<
h
->
mb_height
);
assert
(
h
->
mb_y
<
h
->
mb_height
);
...
@@ -3546,11 +3555,10 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3546,11 +3555,10 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
else
else
h
->
list_count
=
1
;
h
->
list_count
=
1
;
}
else
{
}
else
{
h
->
list_count
=
0
;
h
->
list_count
=
0
;
h
->
ref_count
[
0
]
=
h
->
ref_count
[
1
]
=
0
;
h
->
ref_count
[
0
]
=
h
->
ref_count
[
1
]
=
0
;
}
}
max_refs
=
h
->
picture_structure
==
PICT_FRAME
?
16
:
32
;
max_refs
=
h
->
picture_structure
==
PICT_FRAME
?
16
:
32
;
if
(
h
->
ref_count
[
0
]
>
max_refs
||
h
->
ref_count
[
1
]
>
max_refs
)
{
if
(
h
->
ref_count
[
0
]
>
max_refs
||
h
->
ref_count
[
1
]
>
max_refs
)
{
...
@@ -3590,8 +3598,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3590,8 +3598,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
// corrupt, thus we only do this if frame-mt is enabled.
// corrupt, thus we only do this if frame-mt is enabled.
if
(
h
->
nal_ref_idc
&&
if
(
h
->
nal_ref_idc
&&
ff_h264_decode_ref_pic_marking
(
h0
,
&
h
->
gb
,
ff_h264_decode_ref_pic_marking
(
h0
,
&
h
->
gb
,
!
(
h
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)
||
!
(
h
->
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)
||
h0
->
current_slice
==
0
)
<
0
&&
h0
->
current_slice
==
0
)
<
0
&&
(
h
->
avctx
->
err_recognition
&
AV_EF_EXPLODE
))
(
h
->
avctx
->
err_recognition
&
AV_EF_EXPLODE
))
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
...
@@ -3696,7 +3704,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3696,7 +3704,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
6
*
(
h
->
sps
.
bit_depth_luma
-
8
);
h0
->
last_slice_type
=
slice_type
;
h0
->
last_slice_type
=
slice_type
;
h
->
slice_num
=
++
h0
->
current_slice
;
h
->
slice_num
=
++
h0
->
current_slice
;
if
(
h
->
slice_num
>=
MAX_SLICES
)
{
if
(
h
->
slice_num
>=
MAX_SLICES
)
{
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"Too many slices, increase MAX_SLICES and recompile
\n
"
);
"Too many slices, increase MAX_SLICES and recompile
\n
"
);
...
@@ -3707,7 +3715,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3707,7 +3715,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
int
*
ref2frm
=
h
->
ref2frm
[
h
->
slice_num
&
(
MAX_SLICES
-
1
)][
j
];
int
*
ref2frm
=
h
->
ref2frm
[
h
->
slice_num
&
(
MAX_SLICES
-
1
)][
j
];
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
id_list
[
i
]
=
60
;
id_list
[
i
]
=
60
;
if
(
j
<
h
->
list_count
&&
i
<
h
->
ref_count
[
j
]
&&
h
->
ref_list
[
j
][
i
].
f
.
buf
[
0
])
{
if
(
j
<
h
->
list_count
&&
i
<
h
->
ref_count
[
j
]
&&
h
->
ref_list
[
j
][
i
].
f
.
buf
[
0
])
{
int
k
;
int
k
;
AVBuffer
*
buf
=
h
->
ref_list
[
j
][
i
].
f
.
buf
[
0
]
->
buffer
;
AVBuffer
*
buf
=
h
->
ref_list
[
j
][
i
].
f
.
buf
[
0
]
->
buffer
;
for
(
k
=
0
;
k
<
h
->
short_ref_count
;
k
++
)
for
(
k
=
0
;
k
<
h
->
short_ref_count
;
k
++
)
...
@@ -3723,13 +3732,12 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
...
@@ -3723,13 +3732,12 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
}
}
}
}
ref2frm
[
0
]
=
ref2frm
[
0
]
=
ref2frm
[
1
]
=
-
1
;
ref2frm
[
1
]
=
-
1
;
for
(
i
=
0
;
i
<
16
;
i
++
)
for
(
i
=
0
;
i
<
16
;
i
++
)
ref2frm
[
i
+
2
]
=
4
*
id_list
[
i
]
+
ref2frm
[
i
+
2
]
=
4
*
id_list
[
i
]
+
(
h
->
ref_list
[
j
][
i
].
reference
&
3
);
(
h
->
ref_list
[
j
][
i
].
reference
&
3
);
ref2frm
[
18
+
0
]
=
ref2frm
[
18
+
0
]
=
ref2frm
[
18
+
1
]
=
-
1
;
ref2frm
[
18
+
1
]
=
-
1
;
for
(
i
=
16
;
i
<
48
;
i
++
)
for
(
i
=
16
;
i
<
48
;
i
++
)
ref2frm
[
i
+
4
]
=
4
*
id_list
[(
i
-
16
)
>>
1
]
+
ref2frm
[
i
+
4
]
=
4
*
id_list
[(
i
-
16
)
>>
1
]
+
(
h
->
ref_list
[
j
][
i
].
reference
&
3
);
(
h
->
ref_list
[
j
][
i
].
reference
&
3
);
...
@@ -3884,7 +3892,7 @@ static int fill_filter_caches(H264Context *h, int mb_type)
...
@@ -3884,7 +3892,7 @@ static int fill_filter_caches(H264Context *h, int mb_type)
}
else
{
}
else
{
if
(
curr_mb_field_flag
)
if
(
curr_mb_field_flag
)
top_xy
+=
h
->
mb_stride
&
top_xy
+=
h
->
mb_stride
&
(((
h
->
cur_pic
.
mb_type
[
top_xy
]
>>
7
)
&
1
)
-
1
);
(((
h
->
cur_pic
.
mb_type
[
top_xy
]
>>
7
)
&
1
)
-
1
);
if
(
left_mb_field_flag
!=
curr_mb_field_flag
)
if
(
left_mb_field_flag
!=
curr_mb_field_flag
)
left_xy
[
LBOT
]
+=
h
->
mb_stride
;
left_xy
[
LBOT
]
+=
h
->
mb_stride
;
}
}
...
@@ -3966,18 +3974,18 @@ static int fill_filter_caches(H264Context *h, int mb_type)
...
@@ -3966,18 +3974,18 @@ static int fill_filter_caches(H264Context *h, int mb_type)
* from what the loop filter needs */
* from what the loop filter needs */
if
(
!
CABAC
(
h
)
&&
h
->
pps
.
transform_8x8_mode
)
{
if
(
!
CABAC
(
h
)
&&
h
->
pps
.
transform_8x8_mode
)
{
if
(
IS_8x8DCT
(
top_type
))
{
if
(
IS_8x8DCT
(
top_type
))
{
nnz_cache
[
4
+
8
*
0
]
=
nnz_cache
[
4
+
8
*
0
]
=
nnz_cache
[
5
+
8
*
0
]
=
(
h
->
cbp_table
[
top_xy
]
&
0x4000
)
>>
12
;
nnz_cache
[
5
+
8
*
0
]
=
(
h
->
cbp_table
[
top_xy
]
&
0x4000
)
>>
12
;
nnz_cache
[
6
+
8
*
0
]
=
nnz_cache
[
6
+
8
*
0
]
=
nnz_cache
[
7
+
8
*
0
]
=
(
h
->
cbp_table
[
top_xy
]
&
0x8000
)
>>
12
;
nnz_cache
[
7
+
8
*
0
]
=
(
h
->
cbp_table
[
top_xy
]
&
0x8000
)
>>
12
;
}
}
if
(
IS_8x8DCT
(
left_type
[
LTOP
]))
{
if
(
IS_8x8DCT
(
left_type
[
LTOP
]))
{
nnz_cache
[
3
+
8
*
1
]
=
nnz_cache
[
3
+
8
*
1
]
=
nnz_cache
[
3
+
8
*
2
]
=
(
h
->
cbp_table
[
left_xy
[
LTOP
]]
&
0x2000
)
>>
12
;
// FIXME check MBAFF
nnz_cache
[
3
+
8
*
2
]
=
(
h
->
cbp_table
[
left_xy
[
LTOP
]]
&
0x2000
)
>>
12
;
// FIXME check MBAFF
}
}
if
(
IS_8x8DCT
(
left_type
[
LBOT
]))
{
if
(
IS_8x8DCT
(
left_type
[
LBOT
]))
{
nnz_cache
[
3
+
8
*
3
]
=
nnz_cache
[
3
+
8
*
3
]
=
nnz_cache
[
3
+
8
*
4
]
=
(
h
->
cbp_table
[
left_xy
[
LBOT
]]
&
0x8000
)
>>
12
;
// FIXME check MBAFF
nnz_cache
[
3
+
8
*
4
]
=
(
h
->
cbp_table
[
left_xy
[
LBOT
]]
&
0x8000
)
>>
12
;
// FIXME check MBAFF
}
}
if
(
IS_8x8DCT
(
mb_type
))
{
if
(
IS_8x8DCT
(
mb_type
))
{
...
@@ -4177,7 +4185,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
...
@@ -4177,7 +4185,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
if
((
h
->
workaround_bugs
&
FF_BUG_TRUNCATED
)
&&
if
((
h
->
workaround_bugs
&
FF_BUG_TRUNCATED
)
&&
h
->
cabac
.
bytestream
>
h
->
cabac
.
bytestream_end
+
2
)
{
h
->
cabac
.
bytestream
>
h
->
cabac
.
bytestream_end
+
2
)
{
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
ER_MB_END
);
h
->
mb_y
,
ER_MB_END
);
if
(
h
->
mb_x
>=
lf_x_start
)
if
(
h
->
mb_x
>=
lf_x_start
)
loop_filter
(
h
,
lf_x_start
,
h
->
mb_x
+
1
);
loop_filter
(
h
,
lf_x_start
,
h
->
mb_x
+
1
);
return
0
;
return
0
;
...
@@ -4188,7 +4196,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
...
@@ -4188,7 +4196,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
h
->
mb_x
,
h
->
mb_y
,
h
->
mb_x
,
h
->
mb_y
,
h
->
cabac
.
bytestream_end
-
h
->
cabac
.
bytestream
);
h
->
cabac
.
bytestream_end
-
h
->
cabac
.
bytestream
);
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
,
h
->
mb_y
,
ER_MB_ERROR
);
h
->
mb_y
,
ER_MB_ERROR
);
return
-
1
;
return
-
1
;
}
}
...
@@ -4208,7 +4216,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
...
@@ -4208,7 +4216,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
tprintf
(
h
->
avctx
,
"slice end %d %d
\n
"
,
tprintf
(
h
->
avctx
,
"slice end %d %d
\n
"
,
get_bits_count
(
&
h
->
gb
),
h
->
gb
.
size_in_bits
);
get_bits_count
(
&
h
->
gb
),
h
->
gb
.
size_in_bits
);
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
ER_MB_END
);
h
->
mb_y
,
ER_MB_END
);
if
(
h
->
mb_x
>
lf_x_start
)
if
(
h
->
mb_x
>
lf_x_start
)
loop_filter
(
h
,
lf_x_start
,
h
->
mb_x
);
loop_filter
(
h
,
lf_x_start
,
h
->
mb_x
);
return
0
;
return
0
;
...
@@ -4235,7 +4243,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
...
@@ -4235,7 +4243,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
av_log
(
h
->
avctx
,
AV_LOG_ERROR
,
"error while decoding MB %d %d
\n
"
,
h
->
mb_x
,
h
->
mb_y
);
"error while decoding MB %d %d
\n
"
,
h
->
mb_x
,
h
->
mb_y
);
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
,
h
->
mb_y
,
ER_MB_ERROR
);
h
->
mb_y
,
ER_MB_ERROR
);
return
-
1
;
return
-
1
;
}
}
...
@@ -4255,14 +4263,14 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
...
@@ -4255,14 +4263,14 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
if
(
get_bits_left
(
&
h
->
gb
)
==
0
)
{
if
(
get_bits_left
(
&
h
->
gb
)
==
0
)
{
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
ER_MB_END
);
ER_MB_END
);
return
0
;
return
0
;
}
else
{
}
else
{
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
ER_MB_END
);
ER_MB_END
);
return
-
1
;
return
-
1
;
}
}
...
@@ -4274,15 +4282,15 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
...
@@ -4274,15 +4282,15 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
get_bits_count
(
&
h
->
gb
),
h
->
gb
.
size_in_bits
);
get_bits_count
(
&
h
->
gb
),
h
->
gb
.
size_in_bits
);
if
(
get_bits_left
(
&
h
->
gb
)
==
0
)
{
if
(
get_bits_left
(
&
h
->
gb
)
==
0
)
{
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
h
->
mb_x
-
1
,
h
->
mb_y
,
ER_MB_END
);
ER_MB_END
);
if
(
h
->
mb_x
>
lf_x_start
)
if
(
h
->
mb_x
>
lf_x_start
)
loop_filter
(
h
,
lf_x_start
,
h
->
mb_x
);
loop_filter
(
h
,
lf_x_start
,
h
->
mb_x
);
return
0
;
return
0
;
}
else
{
}
else
{
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
,
er_add_slice
(
h
,
h
->
resync_mb_x
,
h
->
resync_mb_y
,
h
->
mb_x
,
h
->
mb_y
,
ER_MB_ERROR
);
h
->
mb_y
,
ER_MB_ERROR
);
return
-
1
;
return
-
1
;
}
}
...
@@ -4310,8 +4318,8 @@ static int execute_decode_slices(H264Context *h, int context_count)
...
@@ -4310,8 +4318,8 @@ static int execute_decode_slices(H264Context *h, int context_count)
return
decode_slice
(
avctx
,
&
h
);
return
decode_slice
(
avctx
,
&
h
);
}
else
{
}
else
{
for
(
i
=
1
;
i
<
context_count
;
i
++
)
{
for
(
i
=
1
;
i
<
context_count
;
i
++
)
{
hx
=
h
->
thread_context
[
i
];
hx
=
h
->
thread_context
[
i
];
hx
->
er
.
error_count
=
0
;
hx
->
er
.
error_count
=
0
;
}
}
avctx
->
execute
(
avctx
,
decode_slice
,
h
->
thread_context
,
avctx
->
execute
(
avctx
,
decode_slice
,
h
->
thread_context
,
...
@@ -4330,6 +4338,8 @@ static int execute_decode_slices(H264Context *h, int context_count)
...
@@ -4330,6 +4338,8 @@ static int execute_decode_slices(H264Context *h, int context_count)
return
0
;
return
0
;
}
}
static
const
uint8_t
start_code
[]
=
{
0x00
,
0x00
,
0x01
};
static
int
decode_nal_units
(
H264Context
*
h
,
const
uint8_t
*
buf
,
int
buf_size
,
static
int
decode_nal_units
(
H264Context
*
h
,
const
uint8_t
*
buf
,
int
buf_size
,
int
parse_extradata
)
int
parse_extradata
)
{
{
...
@@ -4476,8 +4486,8 @@ again:
...
@@ -4476,8 +4486,8 @@ again:
idr
(
h
);
// FIXME ensure we don't lose some frames if there is reordering
idr
(
h
);
// FIXME ensure we don't lose some frames if there is reordering
case
NAL_SLICE
:
case
NAL_SLICE
:
init_get_bits
(
&
hx
->
gb
,
ptr
,
bit_length
);
init_get_bits
(
&
hx
->
gb
,
ptr
,
bit_length
);
hx
->
intra_gb_ptr
=
hx
->
intra_gb_ptr
=
hx
->
inter_gb_ptr
=
&
hx
->
gb
;
hx
->
inter_gb_ptr
=
&
hx
->
gb
;
hx
->
data_partitioning
=
0
;
hx
->
data_partitioning
=
0
;
if
((
err
=
decode_slice_header
(
hx
,
h
)))
if
((
err
=
decode_slice_header
(
hx
,
h
)))
...
@@ -4514,11 +4524,11 @@ again:
...
@@ -4514,11 +4524,11 @@ again:
return
-
1
;
return
-
1
;
}
else
if
(
CONFIG_H264_VDPAU_DECODER
&&
}
else
if
(
CONFIG_H264_VDPAU_DECODER
&&
h
->
avctx
->
codec
->
capabilities
&
CODEC_CAP_HWACCEL_VDPAU
)
{
h
->
avctx
->
codec
->
capabilities
&
CODEC_CAP_HWACCEL_VDPAU
)
{
static
const
uint8_t
start_code
[]
=
{
ff_vdpau_add_data_chunk
(
h
->
cur_pic_ptr
->
f
.
data
[
0
],
0x00
,
0x00
,
0x01
};
start_code
,
ff_vdpau_add_data_chunk
(
h
->
cur_pic_ptr
->
f
.
data
[
0
],
start_code
,
sizeof
(
start_code
));
sizeof
(
start_code
));
ff_vdpau_add_data_chunk
(
h
->
cur_pic_ptr
->
f
.
data
[
0
],
&
buf
[
buf_index
-
consumed
],
ff_vdpau_add_data_chunk
(
h
->
cur_pic_ptr
->
f
.
data
[
0
],
&
buf
[
buf_index
-
consumed
],
consumed
);
consumed
);
}
else
}
else
context_count
++
;
context_count
++
;
...
@@ -4651,7 +4661,7 @@ static int output_frame(H264Context *h, AVFrame *dst, AVFrame *src)
...
@@ -4651,7 +4661,7 @@ static int output_frame(H264Context *h, AVFrame *dst, AVFrame *src)
int
hshift
=
(
i
>
0
)
?
h
->
chroma_x_shift
:
0
;
int
hshift
=
(
i
>
0
)
?
h
->
chroma_x_shift
:
0
;
int
vshift
=
(
i
>
0
)
?
h
->
chroma_y_shift
:
0
;
int
vshift
=
(
i
>
0
)
?
h
->
chroma_y_shift
:
0
;
int
off
=
((
h
->
sps
.
crop_left
>>
hshift
)
<<
h
->
pixel_shift
)
+
int
off
=
((
h
->
sps
.
crop_left
>>
hshift
)
<<
h
->
pixel_shift
)
+
(
h
->
sps
.
crop_top
>>
vshift
)
*
dst
->
linesize
[
i
];
(
h
->
sps
.
crop_top
>>
vshift
)
*
dst
->
linesize
[
i
];
dst
->
data
[
i
]
+=
off
;
dst
->
data
[
i
]
+=
off
;
}
}
return
0
;
return
0
;
...
@@ -4667,7 +4677,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
...
@@ -4667,7 +4677,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
int
buf_index
=
0
;
int
buf_index
=
0
;
int
ret
;
int
ret
;
h
->
flags
=
avctx
->
flags
;
h
->
flags
=
avctx
->
flags
;
/* end of stream, output what is still in the buffers */
/* end of stream, output what is still in the buffers */
out:
out:
...
@@ -4757,7 +4767,7 @@ av_cold void ff_h264_free_context(H264Context *h)
...
@@ -4757,7 +4767,7 @@ av_cold void ff_h264_free_context(H264Context *h)
static
av_cold
int
h264_decode_end
(
AVCodecContext
*
avctx
)
static
av_cold
int
h264_decode_end
(
AVCodecContext
*
avctx
)
{
{
H264Context
*
h
=
avctx
->
priv_data
;
H264Context
*
h
=
avctx
->
priv_data
;
ff_h264_free_context
(
h
);
ff_h264_free_context
(
h
);
...
@@ -4814,7 +4824,7 @@ AVCodec ff_h264_vdpau_decoder = {
...
@@ -4814,7 +4824,7 @@ AVCodec ff_h264_vdpau_decoder = {
.
flush
=
flush_dpb
,
.
flush
=
flush_dpb
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"
),
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"
),
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_VDPAU_H264
,
.
pix_fmts
=
(
const
enum
AVPixelFormat
[])
{
AV_PIX_FMT_VDPAU_H264
,
AV_PIX_FMT_NONE
},
AV_PIX_FMT_NONE
},
.
profiles
=
NULL_IF_CONFIG_SMALL
(
profiles
),
.
profiles
=
NULL_IF_CONFIG_SMALL
(
profiles
),
};
};
#endif
#endif
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