diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-02-12 00:37:51 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-02-12 00:37:54 +0100 |
commit | 058a3d65427e48b086011d79efb0b0dd85cd3a79 (patch) | |
tree | 3c138440ecbd0a42cabcabf4e4c57ae9701fca35 /libavdevice | |
parent | c33351f3e75d13803f8e19676304b405711d38ea (diff) | |
parent | edc7e67669ad5b4519b18d1932baf75c50577db3 (diff) | |
download | ffmpeg-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.c | 19 | ||||
-rw-r--r-- | libavdevice/version.h | 2 | ||||
-rw-r--r-- | libavdevice/xv.c | 28 |
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, |