[Cin] Getting field_order in dv demuxer early?
Andrew Randrianasulu
randrianasulu at gmail.com
Sat Nov 14 23:16:30 CET 2020
В сообщении от Sunday 15 November 2020 00:07:27 Andrea paz via Cin написал(а):
> Stupid idea from an ignorant person (definitely wrong):
> It seems to me that GG has implemented media autorotation and timecode
> reading them in the metadata and then rotating or aligning them. Maybe
> also the aspect ratio or other can be read/put in the metadata?
> Excuse me for talking about things I don't know...
In my case I probably don't know how to fully initialize those structures, so only this partial form of extracting field_order from container/stream works.
(I tried few other forms of accesing frame data, but they resulted in Cin segfaulting)
dv codec (decoder) itself sets
frame.f->interlaced_frame
and
frame.f->top_field_first
But by time this data become avilable CinGG already probed streams and set default field order 'UNKNOW' (I think this is safe default?)
I'm not sure how to force re-probing or hold filling those field until all data from decoder will be ready.
I found libopenshot, it probably shows how I can improve setting our flags from libavcodec's ones (I missed two cases), but their internal organization a bit different from Cin ....
http://openshot.org/files/libopenshot/FFmpegReader_8cpp_source.html
// Get scan type and order from codec context/params
730 if (!check_interlace) {
731 check_interlace = true;
732 AVFieldOrder field_order = AV_GET_CODEC_ATTRIBUTES(pStream, pCodecCtx)->field_order;
733 switch(field_order) {
734 case AV_FIELD_PROGRESSIVE:
735 info.interlaced_frame = false;
736 break;
737 case AV_FIELD_TT:
738 case AV_FIELD_TB:
739 info.interlaced_frame = true;
740 info.top_field_first = true;
741 break;
742 case AV_FIELD_BT:
743 case AV_FIELD_BB:
744 info.interlaced_frame = true;
745 info.top_field_first = false;
746 break;
747 case AV_FIELD_UNKNOWN:
748 // Check again later?
749 check_interlace = false;
750 break;
751 }
In my patch I omitted AV_FIELD_BT / AV_FIELD_TB (those exist because apparently fields can be coded and displayed in different order!)
Code in ffprobe was:
static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_idx, InputStream *ist, int in_program)
{
AVStream *stream = ist->st;
AVCodecParameters *par;
AVCodecContext *dec_ctx;
char val_str[128];
const char *s;
AVRational sar, dar;
AVBPrint pbuf;
const AVCodecDescriptor *cd;
int ret = 0;
const char *profile = NULL;
par = stream->codecpar;
[skip a lot]
if (par->field_order == AV_FIELD_PROGRESSIVE)
print_str("field_order", "progressive");
else if (par->field_order == AV_FIELD_TT)
print_str("field_order", "tt");
else if (par->field_order == AV_FIELD_BB)
print_str("field_order", "bb");
else if (par->field_order == AV_FIELD_TB)
print_str("field_order", "tb");
else if (par->field_order == AV_FIELD_BT)
print_str("field_order", "bt");
else
print_str_opt("field_order", "unknown");
BUT there was another isntance of field reporting:
static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
AVFormatContext *fmt_ctx)
{
AVBPrint pbuf;
char val_str[128];
const char *s;
int i;
[skip]
case AVMEDIA_TYPE_VIDEO:
print_int("width", frame->width);
print_int("height", frame->height);
s = av_get_pix_fmt_name(frame->format);
if (s) print_str ("pix_fmt", s);
else print_str_opt("pix_fmt", "unknown");
sar = av_guess_sample_aspect_ratio(fmt_ctx, stream, frame);
if (sar.num) {
print_q("sample_aspect_ratio", sar, ':');
} else {
print_str_opt("sample_aspect_ratio", "N/A");
}
print_fmt("pict_type", "%c", av_get_picture_type_char(frame->pict_type));
print_int("coded_picture_number", frame->coded_picture_number);
print_int("display_picture_number", frame->display_picture_number);
print_int("interlaced_frame", frame->interlaced_frame);
print_int("top_field_first", frame->top_field_first);
print_int("repeat_pict", frame->repeat_pict);
BUT I currently have no idea how to say Cin to not fill interlacing type after stream probe says 'unknown' and wait until codec frame probe will give correct info.
More information about the Cin
mailing list