libdc1394.c
Go to the documentation of this file.
1 /*
2  * IIDC1394 grab interface (uses libdc1394 and libraw1394)
3  * Copyright (c) 2004 Roman Shaposhnik
4  * Copyright (c) 2008 Alessandro Sappia
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "config.h"
24 #include "libavformat/avformat.h"
25 #include "libavformat/internal.h"
26 #include "libavutil/log.h"
27 #include "libavutil/mathematics.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/parseutils.h"
30 #include "libavutil/pixdesc.h"
31 
32 #if HAVE_LIBDC1394_2
33 #include <dc1394/dc1394.h>
34 #elif HAVE_LIBDC1394_1
35 #include <libraw1394/raw1394.h>
36 #include <libdc1394/dc1394_control.h>
37 
38 #define DC1394_VIDEO_MODE_320x240_YUV422 MODE_320x240_YUV422
39 #define DC1394_VIDEO_MODE_640x480_YUV411 MODE_640x480_YUV411
40 #define DC1394_VIDEO_MODE_640x480_YUV422 MODE_640x480_YUV422
41 #define DC1394_FRAMERATE_1_875 FRAMERATE_1_875
42 #define DC1394_FRAMERATE_3_75 FRAMERATE_3_75
43 #define DC1394_FRAMERATE_7_5 FRAMERATE_7_5
44 #define DC1394_FRAMERATE_15 FRAMERATE_15
45 #define DC1394_FRAMERATE_30 FRAMERATE_30
46 #define DC1394_FRAMERATE_60 FRAMERATE_60
47 #define DC1394_FRAMERATE_120 FRAMERATE_120
48 #define DC1394_FRAMERATE_240 FRAMERATE_240
49 #endif
50 
51 typedef struct dc1394_data {
52  AVClass *class;
53 #if HAVE_LIBDC1394_1
54  raw1394handle_t handle;
55  dc1394_cameracapture camera;
56  int channel;
57 #elif HAVE_LIBDC1394_2
58  dc1394_t *d;
59  dc1394camera_t *camera;
60  dc1394video_frame_t *frame;
61 #endif
63  int frame_rate; /**< frames per 1000 seconds (fps * 1000) */
64  char *video_size; /**< String describing video size, set by a private option. */
65  char *pixel_format; /**< Set by a private option. */
66  char *framerate; /**< Set by a private option. */
67 
69 } dc1394_data;
70 
72  int width;
73  int height;
77  { 320, 240, AV_PIX_FMT_UYVY422, DC1394_VIDEO_MODE_320x240_YUV422 },
78  { 640, 480, AV_PIX_FMT_UYYVYY411, DC1394_VIDEO_MODE_640x480_YUV411 },
79  { 640, 480, AV_PIX_FMT_UYVY422, DC1394_VIDEO_MODE_640x480_YUV422 },
80  { 0, 0, 0, 0 } /* gotta be the last one */
81 };
82 
86 } dc1394_frame_rates[] = {
87  { 1875, DC1394_FRAMERATE_1_875 },
88  { 3750, DC1394_FRAMERATE_3_75 },
89  { 7500, DC1394_FRAMERATE_7_5 },
90  { 15000, DC1394_FRAMERATE_15 },
91  { 30000, DC1394_FRAMERATE_30 },
92  { 60000, DC1394_FRAMERATE_60 },
93  {120000, DC1394_FRAMERATE_120 },
94  {240000, DC1394_FRAMERATE_240 },
95  { 0, 0 } /* gotta be the last one */
96 };
97 
98 #define OFFSET(x) offsetof(dc1394_data, x)
99 #define DEC AV_OPT_FLAG_DECODING_PARAM
100 static const AVOption options[] = {
101 #if HAVE_LIBDC1394_1
102  { "channel", "", offsetof(dc1394_data, channel), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
103 #endif
104  { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), AV_OPT_TYPE_STRING, {.str = "qvga"}, 0, 0, DEC },
105  { "pixel_format", "", OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = "uyvy422"}, 0, 0, DEC },
106  { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = "ntsc"}, 0, 0, DEC },
107  { NULL },
108 };
109 
110 static const AVClass libdc1394_class = {
111  .class_name = "libdc1394 indev",
112  .item_name = av_default_item_name,
113  .option = options,
114  .version = LIBAVUTIL_VERSION_INT,
115 };
116 
117 
119  struct dc1394_frame_format **select_fmt, struct dc1394_frame_rate **select_fps)
120 {
121  dc1394_data* dc1394 = c->priv_data;
122  AVStream* vst;
123  struct dc1394_frame_format *fmt;
124  struct dc1394_frame_rate *fps;
125  enum AVPixelFormat pix_fmt;
126  int width, height;
128  int ret = 0;
129 
130  if ((pix_fmt = av_get_pix_fmt(dc1394->pixel_format)) == AV_PIX_FMT_NONE) {
131  av_log(c, AV_LOG_ERROR, "No such pixel format: %s.\n", dc1394->pixel_format);
132  ret = AVERROR(EINVAL);
133  goto out;
134  }
135 
136  if ((ret = av_parse_video_size(&width, &height, dc1394->video_size)) < 0) {
137  av_log(c, AV_LOG_ERROR, "Could not parse video size '%s'.\n", dc1394->video_size);
138  goto out;
139  }
140  if ((ret = av_parse_video_rate(&framerate, dc1394->framerate)) < 0) {
141  av_log(c, AV_LOG_ERROR, "Could not parse framerate '%s'.\n", dc1394->framerate);
142  goto out;
143  }
144  dc1394->frame_rate = av_rescale(1000, framerate.num, framerate.den);
145 
146  for (fmt = dc1394_frame_formats; fmt->width; fmt++)
147  if (fmt->pix_fmt == pix_fmt && fmt->width == width && fmt->height == height)
148  break;
149 
150  for (fps = dc1394_frame_rates; fps->frame_rate; fps++)
151  if (fps->frame_rate == dc1394->frame_rate)
152  break;
153 
154  if (!fps->frame_rate || !fmt->width) {
155  av_log(c, AV_LOG_ERROR, "Can't find matching camera format for %s, %dx%d@%d:1000fps\n", av_get_pix_fmt_name(pix_fmt),
156  width, height, dc1394->frame_rate);
157  ret = AVERROR(EINVAL);
158  goto out;
159  }
160 
161  /* create a video stream */
162  vst = avformat_new_stream(c, NULL);
163  if (!vst) {
164  ret = AVERROR(ENOMEM);
165  goto out;
166  }
167  avpriv_set_pts_info(vst, 64, 1, 1000);
170  vst->codec->time_base.den = framerate.num;
171  vst->codec->time_base.num = framerate.den;
172  vst->codec->width = fmt->width;
173  vst->codec->height = fmt->height;
174  vst->codec->pix_fmt = fmt->pix_fmt;
175 
176  /* packet init */
177  av_init_packet(&dc1394->packet);
178  dc1394->packet.size = avpicture_get_size(fmt->pix_fmt, fmt->width, fmt->height);
179  dc1394->packet.stream_index = vst->index;
180  dc1394->packet.flags |= AV_PKT_FLAG_KEY;
181 
182  dc1394->current_frame = 0;
183 
184  vst->codec->bit_rate = av_rescale(dc1394->packet.size * 8, fps->frame_rate, 1000);
185  *select_fps = fps;
186  *select_fmt = fmt;
187 out:
188  return ret;
189 }
190 
191 #if HAVE_LIBDC1394_1
192 static int dc1394_v1_read_header(AVFormatContext *c)
193 {
194  dc1394_data* dc1394 = c->priv_data;
195  AVStream* vst;
196  nodeid_t* camera_nodes;
197  int res;
198  struct dc1394_frame_format *fmt = NULL;
199  struct dc1394_frame_rate *fps = NULL;
200 
201  if (dc1394_read_common(c, &fmt, &fps) != 0)
202  return -1;
203 
204  /* Now let us prep the hardware. */
205  dc1394->handle = dc1394_create_handle(0); /* FIXME: gotta have ap->port */
206  if (!dc1394->handle) {
207  av_log(c, AV_LOG_ERROR, "Can't acquire dc1394 handle on port %d\n", 0 /* ap->port */);
208  goto out;
209  }
210  camera_nodes = dc1394_get_camera_nodes(dc1394->handle, &res, 1);
211  if (!camera_nodes || camera_nodes[dc1394->channel] == DC1394_NO_CAMERA) {
212  av_log(c, AV_LOG_ERROR, "There's no IIDC camera on the channel %d\n", dc1394->channel);
213  goto out_handle;
214  }
215  res = dc1394_dma_setup_capture(dc1394->handle, camera_nodes[dc1394->channel],
216  0,
217  FORMAT_VGA_NONCOMPRESSED,
218  fmt->frame_size_id,
219  SPEED_400,
220  fps->frame_rate_id, 8, 1,
221  c->filename,
222  &dc1394->camera);
223  dc1394_free_camera_nodes(camera_nodes);
224  if (res != DC1394_SUCCESS) {
225  av_log(c, AV_LOG_ERROR, "Can't prepare camera for the DMA capture\n");
226  goto out_handle;
227  }
228 
229  res = dc1394_start_iso_transmission(dc1394->handle, dc1394->camera.node);
230  if (res != DC1394_SUCCESS) {
231  av_log(c, AV_LOG_ERROR, "Can't start isochronous transmission\n");
232  goto out_handle_dma;
233  }
234 
235  return 0;
236 
237 out_handle_dma:
238  dc1394_dma_unlisten(dc1394->handle, &dc1394->camera);
239  dc1394_dma_release_camera(dc1394->handle, &dc1394->camera);
240 out_handle:
241  dc1394_destroy_handle(dc1394->handle);
242 out:
243  return -1;
244 }
245 
246 static int dc1394_v1_read_packet(AVFormatContext *c, AVPacket *pkt)
247 {
248  struct dc1394_data *dc1394 = c->priv_data;
249  int res;
250 
251  /* discard stale frame */
252  if (dc1394->current_frame++) {
253  if (dc1394_dma_done_with_buffer(&dc1394->camera) != DC1394_SUCCESS)
254  av_log(c, AV_LOG_ERROR, "failed to release %d frame\n", dc1394->current_frame);
255  }
256 
257  res = dc1394_dma_single_capture(&dc1394->camera);
258 
259  if (res == DC1394_SUCCESS) {
260  dc1394->packet.data = (uint8_t *)(dc1394->camera.capture_buffer);
261  dc1394->packet.pts = (dc1394->current_frame * 1000000) / dc1394->frame_rate;
262  res = dc1394->packet.size;
263  } else {
264  av_log(c, AV_LOG_ERROR, "DMA capture failed\n");
265  dc1394->packet.data = NULL;
266  res = -1;
267  }
268 
269  *pkt = dc1394->packet;
270  return res;
271 }
272 
273 static int dc1394_v1_close(AVFormatContext * context)
274 {
275  struct dc1394_data *dc1394 = context->priv_data;
276 
277  dc1394_stop_iso_transmission(dc1394->handle, dc1394->camera.node);
278  dc1394_dma_unlisten(dc1394->handle, &dc1394->camera);
279  dc1394_dma_release_camera(dc1394->handle, &dc1394->camera);
280  dc1394_destroy_handle(dc1394->handle);
281 
282  return 0;
283 }
284 
285 #elif HAVE_LIBDC1394_2
286 static int dc1394_v2_read_header(AVFormatContext *c)
287 {
288  dc1394_data* dc1394 = c->priv_data;
289  dc1394camera_list_t *list;
290  int res, i;
291  struct dc1394_frame_format *fmt = NULL;
292  struct dc1394_frame_rate *fps = NULL;
293 
294  if (dc1394_read_common(c, &fmt, &fps) != 0)
295  return -1;
296 
297  /* Now let us prep the hardware. */
298  dc1394->d = dc1394_new();
299  dc1394_camera_enumerate (dc1394->d, &list);
300  if ( !list || list->num == 0) {
301  av_log(c, AV_LOG_ERROR, "Unable to look for an IIDC camera\n\n");
302  goto out;
303  }
304 
305  /* FIXME: To select a specific camera I need to search in list its guid */
306  dc1394->camera = dc1394_camera_new (dc1394->d, list->ids[0].guid);
307  if (list->num > 1) {
308  av_log(c, AV_LOG_INFO, "Working with the first camera found\n");
309  }
310 
311  /* Freeing list of cameras */
312  dc1394_camera_free_list (list);
313 
314  /* Select MAX Speed possible from the cam */
315  if (dc1394->camera->bmode_capable>0) {
316  dc1394_video_set_operation_mode(dc1394->camera, DC1394_OPERATION_MODE_1394B);
317  i = DC1394_ISO_SPEED_800;
318  } else {
319  i = DC1394_ISO_SPEED_400;
320  }
321 
322  for (res = DC1394_FAILURE; i >= DC1394_ISO_SPEED_MIN && res != DC1394_SUCCESS; i--) {
323  res=dc1394_video_set_iso_speed(dc1394->camera, i);
324  }
325  if (res != DC1394_SUCCESS) {
326  av_log(c, AV_LOG_ERROR, "Couldn't set ISO Speed\n");
327  goto out_camera;
328  }
329 
330  if (dc1394_video_set_mode(dc1394->camera, fmt->frame_size_id) != DC1394_SUCCESS) {
331  av_log(c, AV_LOG_ERROR, "Couldn't set video format\n");
332  goto out_camera;
333  }
334 
335  if (dc1394_video_set_framerate(dc1394->camera,fps->frame_rate_id) != DC1394_SUCCESS) {
336  av_log(c, AV_LOG_ERROR, "Couldn't set framerate %d \n",fps->frame_rate);
337  goto out_camera;
338  }
339  if (dc1394_capture_setup(dc1394->camera, 10, DC1394_CAPTURE_FLAGS_DEFAULT)!=DC1394_SUCCESS) {
340  av_log(c, AV_LOG_ERROR, "Cannot setup camera \n");
341  goto out_camera;
342  }
343 
344  if (dc1394_video_set_transmission(dc1394->camera, DC1394_ON) !=DC1394_SUCCESS) {
345  av_log(c, AV_LOG_ERROR, "Cannot start capture\n");
346  goto out_camera;
347  }
348  return 0;
349 
350 out_camera:
351  dc1394_capture_stop(dc1394->camera);
352  dc1394_video_set_transmission(dc1394->camera, DC1394_OFF);
353  dc1394_camera_free (dc1394->camera);
354 out:
355  dc1394_free(dc1394->d);
356  return -1;
357 }
358 
359 static int dc1394_v2_read_packet(AVFormatContext *c, AVPacket *pkt)
360 {
361  struct dc1394_data *dc1394 = c->priv_data;
362  int res;
363 
364  /* discard stale frame */
365  if (dc1394->current_frame++) {
366  if (dc1394_capture_enqueue(dc1394->camera, dc1394->frame) != DC1394_SUCCESS)
367  av_log(c, AV_LOG_ERROR, "failed to release %d frame\n", dc1394->current_frame);
368  }
369 
370  res = dc1394_capture_dequeue(dc1394->camera, DC1394_CAPTURE_POLICY_WAIT, &dc1394->frame);
371  if (res == DC1394_SUCCESS) {
372  dc1394->packet.data = (uint8_t *) dc1394->frame->image;
373  dc1394->packet.pts = dc1394->current_frame * 1000000 / dc1394->frame_rate;
374  res = dc1394->frame->image_bytes;
375  } else {
376  av_log(c, AV_LOG_ERROR, "DMA capture failed\n");
377  dc1394->packet.data = NULL;
378  res = -1;
379  }
380 
381  *pkt = dc1394->packet;
382  return res;
383 }
384 
385 static int dc1394_v2_close(AVFormatContext * context)
386 {
387  struct dc1394_data *dc1394 = context->priv_data;
388 
389  dc1394_video_set_transmission(dc1394->camera, DC1394_OFF);
390  dc1394_capture_stop(dc1394->camera);
391  dc1394_camera_free(dc1394->camera);
392  dc1394_free(dc1394->d);
393 
394  return 0;
395 }
396 
397 AVInputFormat ff_libdc1394_demuxer = {
398  .name = "libdc1394",
399  .long_name = NULL_IF_CONFIG_SMALL("dc1394 v.2 A/V grab"),
400  .priv_data_size = sizeof(struct dc1394_data),
401  .read_header = dc1394_v2_read_header,
402  .read_packet = dc1394_v2_read_packet,
403  .read_close = dc1394_v2_close,
404  .flags = AVFMT_NOFILE,
405  .priv_class = &libdc1394_class,
406 };
407 
408 #endif
409 #if HAVE_LIBDC1394_1
410 AVInputFormat ff_libdc1394_demuxer = {
411  .name = "libdc1394",
412  .long_name = NULL_IF_CONFIG_SMALL("dc1394 v.1 A/V grab"),
413  .priv_data_size = sizeof(struct dc1394_data),
414  .read_header = dc1394_v1_read_header,
415  .read_packet = dc1394_v1_read_packet,
416  .read_close = dc1394_v1_close,
417  .flags = AVFMT_NOFILE,
418  .priv_class = &libdc1394_class,
419 };
420 #endif
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition: pixfmt.h:85
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate.
Definition: parseutils.c:162
AVOption.
Definition: opt.h:251
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
Definition: parseutils.c:131
av_default_item_name
const char * fmt
Definition: avisynth_c.h:669
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
int num
numerator
Definition: rational.h:44
int index
stream index in AVFormatContext
Definition: avformat.h:644
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
struct dc1394_frame_rate dc1394_frame_rates[]
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
set threshold d
Format I/O context.
Definition: avformat.h:944
char * framerate
Set by a private option.
Definition: libdc1394.c:66
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
uint8_t
AVOptions.
static AVPacket pkt
Definition: demuxing.c:56
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
uint8_t * data
enum AVPixelFormat pix_fmt
Definition: v4l.c:63
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
frame
Definition: stft.m:14
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int flags
A combination of AV_PKT_FLAG values.
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
int bit_rate
the average bitrate
char filename[1024]
input or output filename
Definition: avformat.h:994
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:118
#define OFFSET(x)
Definition: libdc1394.c:98
ret
Definition: avfilter.c:821
int width
picture width / height.
enum AVPixelFormat pix_fmt
Definition: libdc1394.c:74
struct dc1394_data dc1394_data
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
Stream structure.
Definition: avformat.h:643
NULL
Definition: eval.c:55
char * pixel_format
Set by a private option.
Definition: libdc1394.c:65
static int width
Definition: tests/utils.c:158
enum AVMediaType codec_type
enum AVCodecID codec_id
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static const AVOption options[]
Definition: libdc1394.c:100
static int dc1394_read_common(AVFormatContext *c, struct dc1394_frame_format **select_fmt, struct dc1394_frame_rate **select_fps)
Definition: libdc1394.c:118
static const AVClass libdc1394_class
Definition: libdc1394.c:110
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
Describe the class of an AVClass context structure.
Definition: log.h:50
synthesis window for stochastic i
rational number numerator/denominator
Definition: rational.h:43
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:282
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
misc parsing utilities
Main libavformat public API header.
int frame_rate
frames per 1000 seconds (fps * 1000)
Definition: libdc1394.c:63
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:345
char * video_size
String describing video size, set by a private option.
Definition: libdc1394.c:64
static double c[64]
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:56
int den
denominator
Definition: rational.h:45
struct dc1394_frame_format dc1394_frame_formats[]
void * priv_data
Format private data.
Definition: avformat.h:964
int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height)
Calculate the size in bytes that a picture of the given width and height would occupy if stored in th...
Definition: avpicture.c:49
#define DEC
Definition: libdc1394.c:99
#define AV_LOG_INFO
Definition: log.h:156
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:1712
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:1700
AVPacket packet
Definition: libdc1394.c:68
packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
Definition: pixfmt.h:86
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int current_frame
Definition: libdc1394.c:62