[FFmpeg-devel] [PATCH 2/2] [RFC]lavf/ffm: update with more options.
Lukasz Marek
lukasz.m.luki2 at gmail.com
Sun Nov 2 19:19:14 CET 2014
TODO: bump micro
Many common codec options are not via ffm protocol.
This commit adds common A/V encoding options to protocol.
Signed-off-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>
---
libavformat/ffmdec.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++
libavformat/ffmenc.c | 60 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 138 insertions(+)
diff --git a/libavformat/ffmdec.c b/libavformat/ffmdec.c
index e95c139..8f5338f 100644
--- a/libavformat/ffmdec.c
+++ b/libavformat/ffmdec.c
@@ -233,6 +233,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
return 0;
}
+static void ffm_report_old_version(AVFormatContext *s)
+{
+ av_log(s, AV_LOG_WARNING,
+ "Old version of feed file detected. Consider deleting feed files.\n");
+}
+
static int ffm2_read_header(AVFormatContext *s)
{
FFMContext *ffm = s->priv_data;
@@ -294,6 +300,17 @@ static int ffm2_read_header(AVFormatContext *s)
if (ff_get_extradata(codec, pb, avio_rb32(pb)) < 0)
return AVERROR(ENOMEM);
}
+ if (avio_tell(pb) < next) {
+ codec->slices = avio_r8(pb);
+ codec->thread_type = avio_r8(pb);
+ codec->compression_level = avio_rb32(pb);
+ codec->global_quality = avio_rb32(pb);
+ codec->ticks_per_frame = avio_rb32(pb);
+ codec->trellis = avio_rb32(pb);
+ codec->profile = avio_rb32(pb);
+ }
+ if (avio_tell(pb) < next)
+ ffm_report_old_version(s);
avio_seek(pb, next, SEEK_SET);
id = avio_rb32(pb);
size = avio_rb32(pb);
@@ -348,11 +365,72 @@ FF_ENABLE_DEPRECATION_WARNINGS
codec->qblur = av_int2double(avio_rb64(pb));
codec->max_qdiff = avio_rb32(pb);
codec->refs = avio_rb32(pb);
+ if (avio_tell(pb) < next) {
+ codec->bidir_refine = avio_rb32(pb);
+ codec->brd_scale = avio_rb32(pb);
+ codec->b_sensitivity = avio_rb32(pb);
+ codec->chromaoffset = avio_rb32(pb);
+ codec->chroma_sample_location = avio_r8(pb);
+ codec->color_primaries = avio_r8(pb);
+ codec->color_range = avio_r8(pb);
+ codec->colorspace = avio_r8(pb);
+ codec->color_trc = avio_r8(pb);
+ codec->context_model = avio_rb32(pb);
+ codec->dia_size = avio_rb32(pb);
+ codec->field_order = avio_r8(pb);
+ codec->frame_skip_exp = avio_rb32(pb);
+ codec->frame_skip_factor = avio_rb32(pb);
+ codec->frame_skip_threshold = avio_rb32(pb);
+ codec->idct_algo = avio_rb16(pb);
+ codec->ildct_cmp = avio_rb16(pb);
+ codec->inter_quant_bias = avio_rb32(pb);
+ codec->intra_quant_bias = avio_rb32(pb);
+ codec->last_predictor_count = avio_rb32(pb);
+ codec->mb_cmp = avio_rb32(pb);
+ codec->mb_lmin = avio_rb16(pb);
+ codec->mb_lmax = avio_rb16(pb);
+ codec->lumi_masking = av_int2double(avio_rb64(pb));
+ codec->dark_masking = av_int2double(avio_rb64(pb));
+ codec->me_penalty_compensation = avio_rb32(pb);
+ codec->me_pre_cmp = avio_rb32(pb);
+ codec->me_sub_cmp = avio_rb32(pb);
+ codec->mv0_threshold = avio_rb32(pb);
+ codec->noise_reduction = avio_rb32(pb);
+ codec->p_masking = av_int2double(avio_rb32(pb));
+ codec->pre_dia_size = avio_rb32(pb);
+ codec->prediction_method = avio_r8(pb);
+ codec->pre_me = avio_rb32(pb);
+ codec->rc_initial_buffer_occupancy = avio_rb32(pb);
+ codec->rc_max_available_vbv_use = av_int2double(avio_rb32(pb));
+ codec->rc_min_vbv_overflow_use = av_int2double(avio_rb32(pb));
+ codec->rtp_payload_size = avio_rb32(pb);
+ codec->sample_aspect_ratio.num = avio_rb32(pb);
+ codec->sample_aspect_ratio.den = avio_rb32(pb);
+ codec->spatial_cplx_masking = av_int2double(avio_rb32(pb));
+ codec->temporal_cplx_masking = av_int2double(avio_rb32(pb));
+ codec->timecode_frame_start = avio_rb64(pb);
+ }
+ if (avio_tell(pb) < next)
+ ffm_report_old_version(s);
break;
case MKBETAG('S', 'T', 'A', 'U'):
codec->sample_rate = avio_rb32(pb);
codec->channels = avio_rl16(pb);
codec->frame_size = avio_rl16(pb);
+ if (avio_tell(pb) < next) {
+ codec->thread_count = avio_r8(pb);
+ codec->strict_std_compliance = avio_rb32(pb);
+ codec->rc_max_rate = avio_rb32(pb);
+ codec->rc_min_rate = avio_rb32(pb);
+ codec->rc_buffer_size = avio_rb32(pb);
+ codec->audio_service_type = avio_r8(pb);
+ codec->channel_layout = avio_rb64(pb);
+ codec->max_prediction_order = avio_rb32(pb);
+ codec->min_prediction_order = avio_rb32(pb);
+ codec->cutoff = avio_rb32(pb);
+ }
+ if (avio_tell(pb) < next)
+ ffm_report_old_version(s);
break;
}
break;
diff --git a/libavformat/ffmenc.c b/libavformat/ffmenc.c
index 7528dbf..3b16feb 100644
--- a/libavformat/ffmenc.c
+++ b/libavformat/ffmenc.c
@@ -148,6 +148,13 @@ static int ffm_write_header(AVFormatContext *s)
avio_wb32(pb, codec->extradata_size);
avio_write(pb, codec->extradata, codec->extradata_size);
}
+ avio_w8(pb, codec->slices);
+ avio_w8(pb, codec->thread_type);
+ avio_wb32(pb, codec->compression_level);
+ avio_wb32(pb, codec->global_quality);
+ avio_wb32(pb, codec->ticks_per_frame);
+ avio_wb32(pb, codec->trellis);
+ avio_wb32(pb, codec->profile);
write_header_chunk(s->pb, pb, MKBETAG('C', 'O', 'M', 'M'));
if(avio_open_dyn_buf(&pb) < 0)
return AVERROR(ENOMEM);
@@ -201,12 +208,65 @@ FF_ENABLE_DEPRECATION_WARNINGS
avio_wb64(pb, av_double2int(codec->qblur));
avio_wb32(pb, codec->max_qdiff);
avio_wb32(pb, codec->refs);
+ avio_wb32(pb, codec->bidir_refine);
+ avio_wb32(pb, codec->brd_scale);
+ avio_wb32(pb, codec->b_sensitivity);
+ avio_wb32(pb, codec->chromaoffset);
+ avio_w8(pb, codec->chroma_sample_location);
+ avio_w8(pb, codec->color_primaries);
+ avio_w8(pb, codec->color_range);
+ avio_w8(pb, codec->colorspace);
+ avio_w8(pb, codec->color_trc);
+ avio_wb32(pb, codec->context_model);
+ avio_wb32(pb, codec->dia_size);
+ avio_w8(pb, codec->field_order);
+ avio_wb32(pb, codec->frame_skip_exp);
+ avio_wb32(pb, codec->frame_skip_factor);
+ avio_wb32(pb, codec->frame_skip_threshold);
+ avio_wb16(pb, codec->idct_algo);
+ avio_wb16(pb, codec->ildct_cmp);
+ avio_wb32(pb, codec->inter_quant_bias);
+ avio_wb32(pb, codec->intra_quant_bias);
+ avio_wb32(pb, codec->last_predictor_count);
+ avio_wb32(pb, codec->mb_cmp);
+ avio_wb16(pb, codec->mb_lmin);
+ avio_wb16(pb, codec->mb_lmax);
+ avio_wb64(pb, av_double2int(codec->lumi_masking));
+ avio_wb64(pb, av_double2int(codec->dark_masking));
+ avio_wb32(pb, codec->me_penalty_compensation);
+ avio_wb32(pb, codec->me_pre_cmp);
+ avio_wb32(pb, codec->me_sub_cmp);
+ avio_wb32(pb, codec->mv0_threshold);
+ avio_wb32(pb, codec->noise_reduction);
+ avio_wb32(pb, av_double2int(codec->p_masking));
+ avio_wb32(pb, codec->pre_dia_size);
+ avio_w8(pb, codec->prediction_method);
+ avio_wb32(pb, codec->pre_me);
+ avio_wb32(pb, codec->rc_initial_buffer_occupancy);
+ avio_wb32(pb, av_double2int(codec->rc_max_available_vbv_use));
+ avio_wb32(pb, av_double2int(codec->rc_min_vbv_overflow_use));
+ avio_wb32(pb, codec->rtp_payload_size);
+ avio_wb32(pb, codec->sample_aspect_ratio.num);
+ avio_wb32(pb, codec->sample_aspect_ratio.den);
+ avio_wb32(pb, av_double2int(codec->spatial_cplx_masking));
+ avio_wb32(pb, av_double2int(codec->temporal_cplx_masking));
+ avio_wb64(pb, codec->timecode_frame_start);
write_header_chunk(s->pb, pb, MKBETAG('S', 'T', 'V', 'I'));
break;
case AVMEDIA_TYPE_AUDIO:
avio_wb32(pb, codec->sample_rate);
avio_wl16(pb, codec->channels);
avio_wl16(pb, codec->frame_size);
+ avio_w8(pb, codec->thread_count);
+ avio_wb32(pb, codec->strict_std_compliance);
+ avio_wb32(pb, codec->rc_max_rate);
+ avio_wb32(pb, codec->rc_min_rate);
+ avio_wb32(pb, codec->rc_buffer_size);
+ avio_w8(pb, codec->audio_service_type);
+ avio_wb64(pb, codec->channel_layout);
+ avio_wb32(pb, codec->max_prediction_order);
+ avio_wb32(pb, codec->min_prediction_order);
+ avio_wb32(pb, codec->cutoff);
write_header_chunk(s->pb, pb, MKBETAG('S', 'T', 'A', 'U'));
break;
default:
--
1.9.1
More information about the ffmpeg-devel
mailing list