aboutsummaryrefslogtreecommitdiffstats
path: root/libavdevice
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-02-12 00:37:51 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-02-12 00:37:54 +0100
commit058a3d65427e48b086011d79efb0b0dd85cd3a79 (patch)
tree3c138440ecbd0a42cabcabf4e4c57ae9701fca35 /libavdevice
parentc33351f3e75d13803f8e19676304b405711d38ea (diff)
parentedc7e67669ad5b4519b18d1932baf75c50577db3 (diff)
downloadffmpeg-058a3d65427e48b086011d79efb0b0dd85cd3a79.tar.gz
Merge remote-tracking branch 'cigaes/master'
* cigaes/master: lavf/lavd: version bump and APIchanges for uncoded frames. tools: add uncoded_frame test program. lavf: add uncodedframecrc test muxer. lavd/xv: preliminary support of uncoded frame. lavd/alsa: preliminary support of uncoded frame. lavf: add write_uncoded_frame() API. Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavdevice')
-rw-r--r--libavdevice/alsa-audio-enc.c19
-rw-r--r--libavdevice/version.h2
-rw-r--r--libavdevice/xv.c28
3 files changed, 42 insertions, 7 deletions
diff --git a/libavdevice/alsa-audio-enc.c b/libavdevice/alsa-audio-enc.c
index 83e1d2f85f..bf56fc46d7 100644
--- a/libavdevice/alsa-audio-enc.c
+++ b/libavdevice/alsa-audio-enc.c
@@ -113,6 +113,24 @@ static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt)
return 0;
}
+static int audio_write_frame(AVFormatContext *s1, int stream_index,
+ AVFrame **frame, unsigned flags)
+{
+ AlsaData *s = s1->priv_data;
+ AVPacket pkt;
+
+ /* ff_alsa_open() should have accepted only supported formats */
+ if ((flags & AV_WRITE_UNCODED_FRAME_QUERY))
+ return av_sample_fmt_is_planar(s1->streams[stream_index]->codec->sample_fmt) ?
+ AVERROR(EINVAL) : 0;
+ /* set only used fields */
+ pkt.data = (*frame)->data[0];
+ pkt.size = (*frame)->nb_samples * s->frame_size;
+ pkt.dts = (*frame)->pkt_dts;
+ pkt.duration = av_frame_get_pkt_duration(*frame);
+ return audio_write_packet(s1, &pkt);
+}
+
static void
audio_get_output_timestamp(AVFormatContext *s1, int stream,
int64_t *dts, int64_t *wall)
@@ -133,6 +151,7 @@ AVOutputFormat ff_alsa_muxer = {
.write_header = audio_write_header,
.write_packet = audio_write_packet,
.write_trailer = ff_alsa_close,
+ .write_uncoded_frame = audio_write_frame,
.get_output_timestamp = audio_get_output_timestamp,
.flags = AVFMT_NOFILE,
};
diff --git a/libavdevice/version.h b/libavdevice/version.h
index 0dedc73551..956ed74643 100644
--- a/libavdevice/version.h
+++ b/libavdevice/version.h
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVDEVICE_VERSION_MAJOR 55
-#define LIBAVDEVICE_VERSION_MINOR 8
+#define LIBAVDEVICE_VERSION_MINOR 9
#define LIBAVDEVICE_VERSION_MICRO 100
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
diff --git a/libavdevice/xv.c b/libavdevice/xv.c
index a4b44c8eda..89d6575f6c 100644
--- a/libavdevice/xv.c
+++ b/libavdevice/xv.c
@@ -36,6 +36,7 @@
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/imgutils.h"
+#include "libavformat/internal.h"
#include "avdevice.h"
typedef struct {
@@ -197,23 +198,19 @@ static int xv_write_header(AVFormatContext *s)
return ret;
}
-static int xv_write_packet(AVFormatContext *s, AVPacket *pkt)
+static int write_picture(AVFormatContext *s, AVPicture *pict)
{
XVContext *xv = s->priv_data;
XvImage *img = xv->yuv_image;
XWindowAttributes window_attrs;
- AVPicture pict;
- AVCodecContext *ctx = s->streams[0]->codec;
uint8_t *data[3] = {
img->data + img->offsets[0],
img->data + img->offsets[1],
img->data + img->offsets[2]
};
- avpicture_fill(&pict, pkt->data, ctx->pix_fmt, ctx->width, ctx->height);
- av_image_copy(data, img->pitches, (const uint8_t **)pict.data, pict.linesize,
+ av_image_copy(data, img->pitches, (const uint8_t **)pict->data, pict->linesize,
xv->image_format, img->width, img->height);
-
XGetWindowAttributes(xv->display, xv->window, &window_attrs);
if (XvShmPutImage(xv->display, xv->xv_port, xv->window, xv->gc,
xv->yuv_image, 0, 0, xv->image_width, xv->image_height, 0, 0,
@@ -224,6 +221,24 @@ static int xv_write_packet(AVFormatContext *s, AVPacket *pkt)
return 0;
}
+static int xv_write_packet(AVFormatContext *s, AVPacket *pkt)
+{
+ AVPicture pict;
+ AVCodecContext *ctx = s->streams[0]->codec;
+
+ avpicture_fill(&pict, pkt->data, ctx->pix_fmt, ctx->width, ctx->height);
+ return write_picture(s, &pict);
+}
+
+static int xv_write_frame(AVFormatContext *s, int stream_index, AVFrame **frame,
+ unsigned flags)
+{
+ /* xv_write_header() should have accepted only supported formats */
+ if ((flags & AV_WRITE_UNCODED_FRAME_QUERY))
+ return 0;
+ return write_picture(s, (AVPicture *)*frame);
+}
+
#define OFFSET(x) offsetof(XVContext, x)
static const AVOption options[] = {
{ "display_name", "set display name", OFFSET(display_name), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
@@ -250,6 +265,7 @@ AVOutputFormat ff_xv_muxer = {
.video_codec = AV_CODEC_ID_RAWVIDEO,
.write_header = xv_write_header,
.write_packet = xv_write_packet,
+ .write_uncoded_frame = xv_write_frame,
.write_trailer = xv_write_trailer,
.flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS,
.priv_class = &xv_class,