File: ffsox_frame.c

package info (click to toggle)
bs1770gain 0.4.12-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,832 kB
  • sloc: ansic: 9,380; sh: 1,288; makefile: 212
file content (122 lines) | stat: -rwxr-xr-x 2,754 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * ffsox_frame.c
 * Copyright (C) 2014 Peter Belkner <pbelkner@users.sf.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2.0 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301  USA
 */
#include <ffsox_priv.h>

int ffsox_frame_create(frame_t *f)
{
  f->nb_samples.frame=0;
  f->nb_samples.stream=0;

  if (NULL==(f->frame=av_frame_alloc())) {
    DMESSAGE("allocation frame");
    goto frame;
  }

  return 0;
// cleanup:
  av_frame_free(&f->frame);
frame:
  return -1;
}

#if 1 // {
int ffsox_frame_create_cc(frame_t *f, AVCodecContext *cc)
{
  const AVCodec *codec=cc->codec;
  AVFrame *frame;
  int nb_samples;

  if (ffsox_frame_create(f)<0) {
    DMESSAGE("creating frame");
    goto frame;
  }

  if (NULL!=codec&&(codec->capabilities&CODEC_CAP_VARIABLE_FRAME_SIZE))
    nb_samples=10000;
  else
    nb_samples=cc->frame_size;

  frame=f->frame;
  frame->format=cc->sample_fmt;
  frame->channel_layout=cc->channel_layout;
  frame->channels=cc->channels;
  frame->sample_rate=cc->sample_rate;
  frame->nb_samples=nb_samples;

  if (0<nb_samples&&av_frame_get_buffer(frame,0)<0) {
    DMESSAGE("allocatiing frame buffer");
    goto buffer;
  }

  return 0;
// cleanup:
buffer:
  ffsox_frame_cleanup(f);
frame:
  return -1;
}
#else // } {
1nt ffsox_frame_create_cc(frame_t *f, AVCodecContext *cc)
{
  const AVCodec *codec=cc->codec;
  AVFrame *frame;
  int nb_samples;

  if (ffsox_frame_create(f)<0) {
    DMESSAGE("creating frame");
    goto frame;
  }

  frame=f->frame;
  frame->format=cc->sample_fmt;
  frame->channel_layout=cc->channel_layout;
  frame->channels=cc->channels;
  frame->sample_rate=cc->sample_rate;
  frame->nb_samples=cc->frame_size;

  if (av_frame_get_buffer(frame,0)<0) {
    DMESSAGE("allocatiing frame buffer");
    goto buffer;
  }

  return 0;
// cleanup:
buffer:
  ffsox_frame_cleanup(f);
frame:
  return -1;
}
#endif // }

void ffsox_frame_cleanup(frame_t *f)
{
  av_frame_free(&f->frame);
}

int ffsox_frame_complete(frame_t *f)
{
  return f->nb_samples.frame==f->frame->nb_samples;
}

void ffsox_frame_reset(frame_t *f)
{
  f->nb_samples.stream+=f->nb_samples.frame;
  f->nb_samples.frame=0;
}