avmux: port to AVCodecParameters

https://bugzilla.gnome.org/show_bug.cgi?id=792900
This commit is contained in:
Mathieu Duponchelle 2018-06-29 20:37:14 +02:00
parent 4f28ea23eb
commit 4116117873

View file

@ -446,10 +446,10 @@ gst_ffmpegmux_request_new_pad (GstElement * element,
/* AVStream needs to be created */ /* AVStream needs to be created */
st = avformat_new_stream (ffmpegmux->context, NULL); st = avformat_new_stream (ffmpegmux->context, NULL);
st->id = collect_pad->padnum; st->id = collect_pad->padnum;
st->codec->codec_type = type; st->codecpar->codec_type = type;
st->codec->codec_id = AV_CODEC_ID_NONE; /* this is a check afterwards */ st->codecpar->codec_id = AV_CODEC_ID_NONE; /* this is a check afterwards */
st->codec->bit_rate = bitrate; st->codecpar->bit_rate = bitrate;
st->codec->frame_size = framesize; st->codecpar->frame_size = framesize;
/* we fill in codec during capsnego */ /* we fill in codec during capsnego */
/* we love debug output (c) (tm) (r) */ /* we love debug output (c) (tm) (r) */
@ -475,6 +475,7 @@ gst_ffmpegmux_setcaps (GstPad * pad, GstCaps * caps)
GstFFMpegMux *ffmpegmux = (GstFFMpegMux *) (gst_pad_get_parent (pad)); GstFFMpegMux *ffmpegmux = (GstFFMpegMux *) (gst_pad_get_parent (pad));
GstFFMpegMuxPad *collect_pad; GstFFMpegMuxPad *collect_pad;
AVStream *st; AVStream *st;
AVCodecContext tmp;
collect_pad = (GstFFMpegMuxPad *) gst_pad_get_element_private (pad); collect_pad = (GstFFMpegMuxPad *) gst_pad_get_element_private (pad);
@ -484,12 +485,14 @@ gst_ffmpegmux_setcaps (GstPad * pad, GstCaps * caps)
/* for the format-specific guesses, we'll go to /* for the format-specific guesses, we'll go to
* our famous codec mapper */ * our famous codec mapper */
if (gst_ffmpeg_caps_to_codecid (caps, st->codec) == AV_CODEC_ID_NONE) if (gst_ffmpeg_caps_to_codecid (caps, &tmp) == AV_CODEC_ID_NONE)
goto not_accepted; goto not_accepted;
avcodec_parameters_from_context (st->codecpar, &tmp);
/* copy over the aspect ratios, ffmpeg expects the stream aspect to match the /* copy over the aspect ratios, ffmpeg expects the stream aspect to match the
* codec aspect. */ * codec aspect. */
st->sample_aspect_ratio = st->codec->sample_aspect_ratio; st->sample_aspect_ratio = st->codecpar->sample_aspect_ratio;
GST_LOG_OBJECT (pad, "accepted caps %" GST_PTR_FORMAT, caps); GST_LOG_OBJECT (pad, "accepted caps %" GST_PTR_FORMAT, caps);
return TRUE; return TRUE;
@ -563,7 +566,7 @@ gst_ffmpegmux_collected (GstCollectPads * pads, gpointer user_data)
AVStream *st = ffmpegmux->context->streams[collect_pad->padnum]; AVStream *st = ffmpegmux->context->streams[collect_pad->padnum];
/* check whether the pad has successfully completed capsnego */ /* check whether the pad has successfully completed capsnego */
if (st->codec->codec_id == AV_CODEC_ID_NONE) { if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {
GST_ELEMENT_ERROR (ffmpegmux, CORE, NEGOTIATION, (NULL), GST_ELEMENT_ERROR (ffmpegmux, CORE, NEGOTIATION, (NULL),
("no caps set on stream %d (%s)", collect_pad->padnum, ("no caps set on stream %d (%s)", collect_pad->padnum,
(st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ? (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ?
@ -571,15 +574,15 @@ gst_ffmpegmux_collected (GstCollectPads * pads, gpointer user_data)
return GST_FLOW_ERROR; return GST_FLOW_ERROR;
} }
/* set framerate for audio */ /* set framerate for audio */
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
switch (st->codec->codec_id) { switch (st->codecpar->codec_id) {
case AV_CODEC_ID_PCM_S16LE: case AV_CODEC_ID_PCM_S16LE:
case AV_CODEC_ID_PCM_S16BE: case AV_CODEC_ID_PCM_S16BE:
case AV_CODEC_ID_PCM_U16LE: case AV_CODEC_ID_PCM_U16LE:
case AV_CODEC_ID_PCM_U16BE: case AV_CODEC_ID_PCM_U16BE:
case AV_CODEC_ID_PCM_S8: case AV_CODEC_ID_PCM_S8:
case AV_CODEC_ID_PCM_U8: case AV_CODEC_ID_PCM_U8:
st->codec->frame_size = 1; st->codecpar->frame_size = 1;
break; break;
default: default:
{ {
@ -590,8 +593,8 @@ gst_ffmpegmux_collected (GstCollectPads * pads, gpointer user_data)
buffer = gst_collect_pads_peek (ffmpegmux->collect, buffer = gst_collect_pads_peek (ffmpegmux->collect,
(GstCollectData *) collect_pad); (GstCollectData *) collect_pad);
if (buffer) { if (buffer) {
st->codec->frame_size = st->codecpar->frame_size =
st->codec->sample_rate * st->codecpar->sample_rate *
GST_BUFFER_DURATION (buffer) / GST_SECOND; GST_BUFFER_DURATION (buffer) / GST_SECOND;
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
} }
@ -732,8 +735,6 @@ gst_ffmpegmux_collected (GstCollectPads * pads, gpointer user_data)
buf = buf =
gst_collect_pads_pop (ffmpegmux->collect, (GstCollectData *) best_pad); gst_collect_pads_pop (ffmpegmux->collect, (GstCollectData *) best_pad);
ffmpegmux->context->streams[best_pad->padnum]->codec->frame_number++;
/* set time */ /* set time */
pkt.pts = gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (buf), pkt.pts = gst_ffmpeg_time_gst_to_ff (GST_BUFFER_TIMESTAMP (buf),
ffmpegmux->context->streams[best_pad->padnum]->time_base); ffmpegmux->context->streams[best_pad->padnum]->time_base);