Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
d90cf87b
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d90cf87b
编写于
4月 25, 2003
作者:
M
Michael Niedermayer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixing mixed dr1 + internal buffers
Originally committed as revision 1820 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
5755c27f
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
93 addition
and
56 deletion
+93
-56
libavcodec/avcodec.h
libavcodec/avcodec.h
+12
-0
libavcodec/dv.c
libavcodec/dv.c
+2
-9
libavcodec/h264.c
libavcodec/h264.c
+2
-1
libavcodec/huffyuv.c
libavcodec/huffyuv.c
+2
-8
libavcodec/mpegvideo.c
libavcodec/mpegvideo.c
+4
-9
libavcodec/utils.c
libavcodec/utils.c
+71
-29
未找到文件。
libavcodec/avcodec.h
浏览文件 @
d90cf87b
...
...
@@ -1089,6 +1089,17 @@ typedef struct AVCodecContext {
*/
int
color_table_id
;
/**
* internal_buffer count.
* Dont touch, used by lavc default_get_buffer()
*/
int
internal_buffer_count
;
/**
* internal_buffers.
* Dont touch, used by lavc default_get_buffer()
*/
void
*
internal_buffer
;
}
AVCodecContext
;
...
...
@@ -1320,6 +1331,7 @@ AVFrame *avcodec_alloc_frame(void);
int
avcodec_default_get_buffer
(
AVCodecContext
*
s
,
AVFrame
*
pic
);
void
avcodec_default_release_buffer
(
AVCodecContext
*
s
,
AVFrame
*
pic
);
void
avcodec_default_free_buffers
(
AVCodecContext
*
s
);
int
avcodec_open
(
AVCodecContext
*
avctx
,
AVCodec
*
codec
);
int
avcodec_decode_audio
(
AVCodecContext
*
avctx
,
int16_t
*
samples
,
...
...
libavcodec/dv.c
浏览文件 @
d90cf87b
...
...
@@ -624,15 +624,8 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
static
int
dvvideo_decode_end
(
AVCodecContext
*
avctx
)
{
DVVideoDecodeContext
*
s
=
avctx
->
priv_data
;
int
i
;
if
(
avctx
->
get_buffer
==
avcodec_default_get_buffer
){
for
(
i
=
0
;
i
<
4
;
i
++
){
av_freep
(
&
s
->
picture
.
base
[
i
]);
s
->
picture
.
data
[
i
]
=
NULL
;
}
av_freep
(
&
s
->
picture
.
opaque
);
}
avcodec_default_free_buffers
(
avctx
);
return
0
;
}
...
...
libavcodec/h264.c
浏览文件 @
d90cf87b
...
...
@@ -3868,6 +3868,7 @@ fprintf(stderr, "FMO not supported\n");
|) | | |
| slice_group_id[ i ] |1 |u(v) |
#endif
break
;
}
}
pps
->
ref_count
[
0
]
=
get_ue_golomb
(
&
s
->
gb
)
+
1
;
...
...
@@ -4366,6 +4367,6 @@ AVCodec h264_decoder = {
NULL
,
decode_end
,
decode_frame
,
/*CODEC_CAP_DRAW_HORIZ_BAND |
CODEC_CAP_DR1 | */
CODEC_CAP_TRUNCATED
,
/*CODEC_CAP_DRAW_HORIZ_BAND |
*/
CODEC_CAP_DR1
|
CODEC_CAP_TRUNCATED
,
};
libavcodec/huffyuv.c
浏览文件 @
d90cf87b
...
...
@@ -959,14 +959,8 @@ static int decode_end(AVCodecContext *avctx)
for
(
i
=
0
;
i
<
3
;
i
++
){
free_vlc
(
&
s
->
vlc
[
i
]);
}
if
(
avctx
->
get_buffer
==
avcodec_default_get_buffer
){
for
(
i
=
0
;
i
<
4
;
i
++
){
av_freep
(
&
s
->
picture
.
base
[
i
]);
s
->
picture
.
data
[
i
]
=
NULL
;
}
av_freep
(
&
s
->
picture
.
opaque
);
}
avcodec_default_free_buffers
(
avctx
);
return
0
;
}
...
...
libavcodec/mpegvideo.c
浏览文件 @
d90cf87b
...
...
@@ -305,15 +305,8 @@ static void free_picture(MpegEncContext *s, Picture *pic){
av_freep
(
&
pic
->
motion_val
[
i
]);
av_freep
(
&
pic
->
ref_index
[
i
]);
}
if
(
pic
->
type
==
FF_BUFFER_TYPE_INTERNAL
){
for
(
i
=
0
;
i
<
4
;
i
++
){
av_freep
(
&
pic
->
base
[
i
]);
pic
->
data
[
i
]
=
NULL
;
}
av_freep
(
&
pic
->
opaque
);
pic
->
type
=
0
;
}
else
if
(
pic
->
type
==
FF_BUFFER_TYPE_SHARED
){
if
(
pic
->
type
==
FF_BUFFER_TYPE_SHARED
){
for
(
i
=
0
;
i
<
4
;
i
++
){
pic
->
base
[
i
]
=
pic
->
data
[
i
]
=
NULL
;
...
...
@@ -524,6 +517,7 @@ void MPV_common_end(MpegEncContext *s)
for
(
i
=
0
;
i
<
MAX_PICTURE_COUNT
;
i
++
){
free_picture
(
s
,
&
s
->
picture
[
i
]);
}
avcodec_default_free_buffers
(
s
->
avctx
);
s
->
context_initialized
=
0
;
}
...
...
@@ -978,6 +972,7 @@ alloc:
s
->
last_picture_ptr
=
s
->
next_picture_ptr
;
s
->
next_picture_ptr
=
s
->
current_picture_ptr
;
}
if
(
s
->
last_picture_ptr
)
s
->
last_picture
=
*
s
->
last_picture_ptr
;
if
(
s
->
next_picture_ptr
)
s
->
next_picture
=
*
s
->
next_picture_ptr
;
if
(
s
->
new_picture_ptr
)
s
->
new_picture
=
*
s
->
new_picture_ptr
;
...
...
libavcodec/utils.c
浏览文件 @
d90cf87b
...
...
@@ -119,29 +119,39 @@ void register_avcodec(AVCodec *format)
format
->
next
=
NULL
;
}
typedef
struct
DefaultPicOpaque
{
typedef
struct
InternalBuffer
{
int
last_pic_num
;
uint8_t
*
base
[
4
];
uint8_t
*
data
[
4
];
}
DefaultPicOpaque
;
}
InternalBuffer
;
#define INTERNAL_BUFFER_SIZE 32
int
avcodec_default_get_buffer
(
AVCodecContext
*
s
,
AVFrame
*
pic
){
int
i
;
const
int
width
=
s
->
width
;
const
int
height
=
s
->
height
;
DefaultPicOpaque
*
opaque
;
InternalBuffer
*
buf
;
assert
(
pic
->
data
[
0
]
==
NULL
);
assert
(
pic
->
type
==
0
||
pic
->
type
==
FF_BUFFER_TYPE_INTERNAL
);
if
(
pic
->
opaque
){
opaque
=
(
DefaultPicOpaque
*
)
pic
->
opaque
;
for
(
i
=
0
;
i
<
3
;
i
++
)
pic
->
data
[
i
]
=
opaque
->
data
[
i
];
assert
(
INTERNAL_BUFFER_SIZE
>
s
->
internal_buffer_count
);
// printf("get_buffer %X coded_pic_num:%d last:%d\n", pic->opaque, pic->coded_picture_number, opaque->last_pic_num);
pic
->
age
=
pic
->
coded_picture_number
-
opaque
->
last_pic_num
;
opaque
->
last_pic_num
=
pic
->
coded_picture_number
;
//printf("age: %d %d %d\n", pic->age, c->picture_number, pic->coded_picture_number);
if
(
s
->
internal_buffer
==
NULL
){
s
->
internal_buffer
=
av_mallocz
(
INTERNAL_BUFFER_SIZE
*
sizeof
(
InternalBuffer
));
}
#if 0
s->internal_buffer= av_fast_realloc(
s->internal_buffer,
&s->internal_buffer_size,
sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/
);
#endif
buf
=
&
((
InternalBuffer
*
)
s
->
internal_buffer
)[
s
->
internal_buffer_count
];
if
(
buf
->
base
[
0
]){
pic
->
age
=
pic
->
coded_picture_number
-
buf
->
last_pic_num
;
buf
->
last_pic_num
=
pic
->
coded_picture_number
;
}
else
{
int
align
,
h_chroma_shift
,
v_chroma_shift
;
int
w
,
h
,
pixel_size
;
...
...
@@ -174,11 +184,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
h
+=
EDGE_WIDTH
*
2
;
}
opaque
=
av_mallocz
(
sizeof
(
DefaultPicOpaque
));
if
(
opaque
==
NULL
)
return
-
1
;
pic
->
opaque
=
opaque
;
opaque
->
last_pic_num
=
-
256
*
256
*
256
*
64
;
buf
->
last_pic_num
=
-
256
*
256
*
256
*
64
;
for
(
i
=
0
;
i
<
3
;
i
++
){
const
int
h_shift
=
i
==
0
?
0
:
h_chroma_shift
;
...
...
@@ -186,32 +192,51 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
pic
->
linesize
[
i
]
=
pixel_size
*
w
>>
h_shift
;
pic
->
base
[
i
]
=
av_mallocz
((
pic
->
linesize
[
i
]
*
h
>>
v_shift
)
+
16
);
//FIXME 16
if
(
pic
->
base
[
i
]
==
NULL
)
return
-
1
;
memset
(
pic
->
base
[
i
],
128
,
pic
->
linesize
[
i
]
*
h
>>
v_shift
);
buf
->
base
[
i
]
=
av_mallocz
((
pic
->
linesize
[
i
]
*
h
>>
v_shift
)
+
16
);
//FIXME 16
if
(
buf
->
base
[
i
]
==
NULL
)
return
-
1
;
memset
(
buf
->
base
[
i
],
128
,
pic
->
linesize
[
i
]
*
h
>>
v_shift
);
if
(
s
->
flags
&
CODEC_FLAG_EMU_EDGE
)
pic
->
data
[
i
]
=
pic
->
base
[
i
];
buf
->
data
[
i
]
=
buf
->
base
[
i
];
else
pic
->
data
[
i
]
=
pic
->
base
[
i
]
+
(
pic
->
linesize
[
i
]
*
EDGE_WIDTH
>>
v_shift
)
+
(
EDGE_WIDTH
>>
h_shift
);
opaque
->
data
[
i
]
=
pic
->
data
[
i
];
buf
->
data
[
i
]
=
buf
->
base
[
i
]
+
(
pic
->
linesize
[
i
]
*
EDGE_WIDTH
>>
v_shift
)
+
(
EDGE_WIDTH
>>
h_shift
);
}
pic
->
age
=
256
*
256
*
256
*
64
;
pic
->
type
=
FF_BUFFER_TYPE_INTERNAL
;
}
for
(
i
=
0
;
i
<
4
;
i
++
){
pic
->
base
[
i
]
=
buf
->
base
[
i
];
pic
->
data
[
i
]
=
buf
->
data
[
i
];
}
s
->
internal_buffer_count
++
;
return
0
;
}
void
avcodec_default_release_buffer
(
AVCodecContext
*
s
,
AVFrame
*
pic
){
int
i
;
InternalBuffer
*
buf
,
*
last
,
temp
;
assert
(
pic
->
type
==
FF_BUFFER_TYPE_INTERNAL
);
for
(
i
=
0
;
i
<
3
;
i
++
)
for
(
i
=
0
;
i
<
s
->
internal_buffer_count
;
i
++
){
//just 3-5 checks so is not worth to optimize
buf
=
&
((
InternalBuffer
*
)
s
->
internal_buffer
)[
i
];
if
(
buf
->
data
[
0
]
==
pic
->
data
[
0
])
break
;
}
assert
(
i
<
s
->
internal_buffer_count
);
s
->
internal_buffer_count
--
;
last
=
&
((
InternalBuffer
*
)
s
->
internal_buffer
)[
s
->
internal_buffer_count
];
temp
=
*
buf
;
*
buf
=
*
last
;
*
last
=
temp
;
for
(
i
=
0
;
i
<
3
;
i
++
){
pic
->
data
[
i
]
=
NULL
;
// pic->base[i]=NULL;
}
//printf("R%X\n", pic->opaque);
}
...
...
@@ -592,6 +617,23 @@ void avcodec_flush_buffers(AVCodecContext *avctx)
}
}
void
avcodec_default_free_buffers
(
AVCodecContext
*
s
){
int
i
,
j
;
if
(
s
->
internal_buffer
==
NULL
)
return
;
for
(
i
=
0
;
i
<
INTERNAL_BUFFER_SIZE
;
i
++
){
InternalBuffer
*
buf
=
&
((
InternalBuffer
*
)
s
->
internal_buffer
)[
i
];
for
(
j
=
0
;
j
<
4
;
j
++
){
av_freep
(
&
buf
->
base
[
j
]);
buf
->
data
[
j
]
=
NULL
;
}
}
av_freep
(
&
s
->
internal_buffer
);
s
->
internal_buffer_count
=
0
;
}
int
av_reduce
(
int
*
dst_nom
,
int
*
dst_den
,
int64_t
nom
,
int64_t
den
,
int64_t
max
){
int
exact
=
1
,
sign
=
0
;
int64_t
gcd
,
larger
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录