FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
audio_frame_queue.c
Go to the documentation of this file.
1
/*
2
* Audio Frame Queue
3
* Copyright (c) 2012 Justin Ruggles
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavutil/common.h
"
23
#include "
audio_frame_queue.h
"
24
#include "
internal.h
"
25
#include "
libavutil/avassert.h
"
26
27
void
ff_af_queue_init
(
AVCodecContext
*avctx,
AudioFrameQueue
*afq)
28
{
29
afq->
avctx
= avctx;
30
afq->
remaining_delay
= avctx->
delay
;
31
afq->
remaining_samples
= avctx->
delay
;
32
afq->
frame_count
= 0;
33
}
34
35
void
ff_af_queue_close
(
AudioFrameQueue
*afq)
36
{
37
if
(afq->
frame_count
)
38
av_log
(afq->
avctx
,
AV_LOG_WARNING
,
"%d frames left in the queue on closing\n"
, afq->
frame_count
);
39
av_freep
(&afq->
frames
);
40
memset(afq, 0,
sizeof
(*afq));
41
}
42
43
int
ff_af_queue_add
(
AudioFrameQueue
*afq,
const
AVFrame
*f)
44
{
45
AudioFrame
*
new
=
av_fast_realloc
(afq->
frames
, &afq->
frame_alloc
,
sizeof
(*afq->
frames
)*(afq->
frame_count
+1));
46
if
(!
new
)
47
return
AVERROR
(ENOMEM);
48
afq->
frames
=
new
;
49
new
+= afq->
frame_count
;
50
51
/* get frame parameters */
52
new
->duration = f->
nb_samples
;
53
new
->duration += afq->
remaining_delay
;
54
if
(f->
pts
!=
AV_NOPTS_VALUE
) {
55
new
->pts =
av_rescale_q
(f->
pts
,
56
afq->
avctx
->
time_base
,
57
(
AVRational
){ 1, afq->
avctx
->
sample_rate
});
58
new
->pts -= afq->
remaining_delay
;
59
if
(afq->
frame_count
&&
new
[-1].pts >= new->pts)
60
av_log
(afq->
avctx
,
AV_LOG_WARNING
,
"Que input is backward in time\n"
);
61
}
else
{
62
new
->pts =
AV_NOPTS_VALUE
;
63
}
64
afq->remaining_delay = 0;
65
66
/* add frame sample count */
67
afq->remaining_samples += f->nb_samples;
68
69
afq->frame_count++;
70
71
return
0;
72
}
73
74
void
ff_af_queue_remove
(
AudioFrameQueue
*afq,
int
nb_samples
, int64_t *pts,
75
int
*
duration
)
76
{
77
int64_t out_pts =
AV_NOPTS_VALUE
;
78
int
removed_samples = 0;
79
int
i;
80
81
if
(afq->
frame_count
|| afq->
frame_alloc
) {
82
if
(afq->
frames
->
pts
!=
AV_NOPTS_VALUE
)
83
out_pts = afq->
frames
->
pts
;
84
}
85
if
(!afq->
frame_count
)
86
av_log
(afq->
avctx
,
AV_LOG_WARNING
,
"Trying to remove %d samples, but the queue is empty\n"
, nb_samples);
87
if
(pts)
88
*pts =
ff_samples_to_time_base
(afq->
avctx
, out_pts);
89
90
for
(i=0; nb_samples && i<afq->
frame_count
; i++){
91
int
n=
FFMIN
(afq->
frames
[i].
duration
, nb_samples);
92
afq->
frames
[i].
duration
-= n;
93
nb_samples -= n;
94
removed_samples += n;
95
if
(afq->
frames
[i].
pts
!=
AV_NOPTS_VALUE
)
96
afq->
frames
[i].
pts
+= n;
97
}
98
afq->
remaining_samples
-= removed_samples;
99
i -= i && afq->
frames
[i-1].
duration
;
100
memmove(afq->
frames
, afq->
frames
+ i,
sizeof
(*afq->
frames
) * (afq->
frame_count
- i));
101
afq->
frame_count
-= i;
102
103
if
(nb_samples){
104
av_assert0
(!afq->
frame_count
);
105
av_assert0
(afq->
remaining_samples
== afq->
remaining_delay
);
106
if
(afq->
frames
&& afq->
frames
[0].
pts
!=
AV_NOPTS_VALUE
)
107
afq->
frames
[0].
pts
+=
nb_samples
;
108
av_log
(afq->
avctx
,
AV_LOG_DEBUG
,
"Trying to remove %d more samples than there are in the queue\n"
, nb_samples);
109
}
110
if
(duration)
111
*duration =
ff_samples_to_time_base
(afq->
avctx
, removed_samples);
112
}
Generated on Sat May 25 2013 03:58:31 for FFmpeg by
1.8.2