In most places where it's used, it's as a pointless write-only field. Only rv10 decoder actually reads from it, but it stores some internal version info in it. There is no reason for it to be in a public field.tags/n0.11
| @@ -1228,15 +1228,12 @@ typedef struct AVCodecContext { | |||||
| */ | */ | ||||
| unsigned int stream_codec_tag; | unsigned int stream_codec_tag; | ||||
| #if FF_API_SUB_ID | |||||
| /** | /** | ||||
| * Some codecs need additional format info. It is stored here. | |||||
| * If any muxer uses this then ALL demuxers/parsers AND encoders for the | |||||
| * specific codec MUST set it correctly otherwise stream copy breaks. | |||||
| * In general use of this field by muxers is not recommended. | |||||
| * - encoding: Set by libavcodec. | |||||
| * - decoding: Set by libavcodec. (FIXME: Is this OK?) | |||||
| * @deprecated this field is unused | |||||
| */ | */ | ||||
| int sub_id; | |||||
| attribute_deprecated int sub_id; | |||||
| #endif | |||||
| void *priv_data; | void *priv_data; | ||||
| @@ -1237,7 +1237,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) | |||||
| * that behave like P-frames. */ | * that behave like P-frames. */ | ||||
| avctx->has_b_frames = !s->low_delay; | avctx->has_b_frames = !s->low_delay; | ||||
| assert((avctx->sub_id == 1) == (avctx->codec_id == CODEC_ID_MPEG1VIDEO)); | |||||
| if (avctx->codec_id == CODEC_ID_MPEG1VIDEO) { | if (avctx->codec_id == CODEC_ID_MPEG1VIDEO) { | ||||
| //MPEG-1 fps | //MPEG-1 fps | ||||
| avctx->time_base.den = avpriv_frame_rate_tab[s->frame_rate_index].num; | avctx->time_base.den = avpriv_frame_rate_tab[s->frame_rate_index].num; | ||||
| @@ -1382,7 +1381,6 @@ static void mpeg_decode_sequence_extension(Mpeg1Context *s1) | |||||
| av_dlog(s->avctx, "sequence extension\n"); | av_dlog(s->avctx, "sequence extension\n"); | ||||
| s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG2VIDEO; | s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG2VIDEO; | ||||
| s->avctx->sub_id = 2; /* indicates MPEG-2 found */ | |||||
| if (s->avctx->debug & FF_DEBUG_PICT_INFO) | if (s->avctx->debug & FF_DEBUG_PICT_INFO) | ||||
| av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n", | av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n", | ||||
| @@ -2000,7 +1998,6 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, | |||||
| s->frame_pred_frame_dct = 1; | s->frame_pred_frame_dct = 1; | ||||
| s->chroma_format = 1; | s->chroma_format = 1; | ||||
| s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG1VIDEO; | s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG1VIDEO; | ||||
| avctx->sub_id = 1; /* indicates MPEG-1 */ | |||||
| s->out_format = FMT_MPEG1; | s->out_format = FMT_MPEG1; | ||||
| s->swap_uv = 0; // AFAIK VCR2 does not have SEQ_HEADER | s->swap_uv = 0; // AFAIK VCR2 does not have SEQ_HEADER | ||||
| if (s->flags & CODEC_FLAG_LOW_DELAY) | if (s->flags & CODEC_FLAG_LOW_DELAY) | ||||
| @@ -2060,7 +2057,6 @@ static int vcr2_init_sequence(AVCodecContext *avctx) | |||||
| s->frame_pred_frame_dct = 1; | s->frame_pred_frame_dct = 1; | ||||
| s->chroma_format = 1; | s->chroma_format = 1; | ||||
| s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG2VIDEO; | s->codec_id = s->avctx->codec_id = CODEC_ID_MPEG2VIDEO; | ||||
| avctx->sub_id = 2; /* indicates MPEG-2 */ | |||||
| s1->save_width = s->width; | s1->save_width = s->width; | ||||
| s1->save_height = s->height; | s1->save_height = s->height; | ||||
| s1->save_progressive_seq = s->progressive_sequence; | s1->save_progressive_seq = s->progressive_sequence; | ||||
| @@ -1660,7 +1660,6 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, | |||||
| avctx->channel_layout = s->nb_channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO; | avctx->channel_layout = s->nb_channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO; | ||||
| if (!avctx->bit_rate) | if (!avctx->bit_rate) | ||||
| avctx->bit_rate = s->bit_rate; | avctx->bit_rate = s->bit_rate; | ||||
| avctx->sub_id = s->layer; | |||||
| if (s->frame_size <= 0 || s->frame_size > buf_size) { | if (s->frame_size <= 0 || s->frame_size > buf_size) { | ||||
| av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); | av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); | ||||
| @@ -1733,7 +1732,6 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data, | |||||
| avctx->channels = s->nb_channels; | avctx->channels = s->nb_channels; | ||||
| if (!avctx->bit_rate) | if (!avctx->bit_rate) | ||||
| avctx->bit_rate = s->bit_rate; | avctx->bit_rate = s->bit_rate; | ||||
| avctx->sub_id = s->layer; | |||||
| s->frame_size = len; | s->frame_size = len; | ||||
| @@ -142,6 +142,5 @@ int avpriv_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_r | |||||
| *sample_rate = s->sample_rate; | *sample_rate = s->sample_rate; | ||||
| *channels = s->nb_channels; | *channels = s->nb_channels; | ||||
| *bit_rate = s->bit_rate; | *bit_rate = s->bit_rate; | ||||
| avctx->sub_id = s->layer; | |||||
| return s->frame_size; | return s->frame_size; | ||||
| } | } | ||||
| @@ -69,7 +69,6 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, | |||||
| pc->frame_rate.num = avctx->time_base.num = avpriv_frame_rate_tab[frame_rate_index].den; | pc->frame_rate.num = avctx->time_base.num = avpriv_frame_rate_tab[frame_rate_index].den; | ||||
| avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400; | avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400; | ||||
| avctx->codec_id = CODEC_ID_MPEG1VIDEO; | avctx->codec_id = CODEC_ID_MPEG1VIDEO; | ||||
| avctx->sub_id = 1; | |||||
| } | } | ||||
| break; | break; | ||||
| case EXT_START_CODE: | case EXT_START_CODE: | ||||
| @@ -94,7 +93,6 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, | |||||
| avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1) * 2; | avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1) * 2; | ||||
| avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1); | avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1); | ||||
| avctx->codec_id = CODEC_ID_MPEG2VIDEO; | avctx->codec_id = CODEC_ID_MPEG2VIDEO; | ||||
| avctx->sub_id = 2; /* forces MPEG2 */ | |||||
| } | } | ||||
| break; | break; | ||||
| case 0x8: /* picture coding extension */ | case 0x8: /* picture coding extension */ | ||||
| @@ -109,7 +109,9 @@ static const AVOption options[]={ | |||||
| #endif | #endif | ||||
| {"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, "flags2"}, | {"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, "flags2"}, | ||||
| {"local_header", "place global headers at every keyframe instead of in extradata", 0, AV_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_LOCAL_HEADER }, INT_MIN, INT_MAX, V|E, "flags2"}, | {"local_header", "place global headers at every keyframe instead of in extradata", 0, AV_OPT_TYPE_CONST, {.dbl = CODEC_FLAG2_LOCAL_HEADER }, INT_MIN, INT_MAX, V|E, "flags2"}, | ||||
| #if FF_API_SUB_ID | |||||
| {"sub_id", NULL, OFFSET(sub_id), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | {"sub_id", NULL, OFFSET(sub_id), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| #endif | |||||
| {"me_method", "set motion estimation method", OFFSET(me_method), AV_OPT_TYPE_INT, {.dbl = ME_EPZS }, INT_MIN, INT_MAX, V|E, "me_method"}, | {"me_method", "set motion estimation method", OFFSET(me_method), AV_OPT_TYPE_INT, {.dbl = ME_EPZS }, INT_MIN, INT_MAX, V|E, "me_method"}, | ||||
| {"zero", "zero motion estimation (fastest)", 0, AV_OPT_TYPE_CONST, {.dbl = ME_ZERO }, INT_MIN, INT_MAX, V|E, "me_method" }, | {"zero", "zero motion estimation (fastest)", 0, AV_OPT_TYPE_CONST, {.dbl = ME_ZERO }, INT_MIN, INT_MAX, V|E, "me_method" }, | ||||
| {"full", "full motion estimation (slowest)", 0, AV_OPT_TYPE_CONST, {.dbl = ME_FULL }, INT_MIN, INT_MAX, V|E, "me_method" }, | {"full", "full motion estimation (slowest)", 0, AV_OPT_TYPE_CONST, {.dbl = ME_FULL }, INT_MIN, INT_MAX, V|E, "me_method" }, | ||||
| @@ -402,7 +402,6 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src, | |||||
| int err = 0; | int err = 0; | ||||
| if (dst != src) { | if (dst != src) { | ||||
| dst->sub_id = src->sub_id; | |||||
| dst->time_base = src->time_base; | dst->time_base = src->time_base; | ||||
| dst->width = src->width; | dst->width = src->width; | ||||
| dst->height = src->height; | dst->height = src->height; | ||||
| @@ -40,6 +40,11 @@ | |||||
| #define DC_VLC_BITS 14 //FIXME find a better solution | #define DC_VLC_BITS 14 //FIXME find a better solution | ||||
| typedef struct RVDecContext { | |||||
| MpegEncContext m; | |||||
| int sub_id; | |||||
| } RVDecContext; | |||||
| static const uint16_t rv_lum_code[256] = | static const uint16_t rv_lum_code[256] = | ||||
| { | { | ||||
| 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, | 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, | ||||
| @@ -293,8 +298,9 @@ static int rv10_decode_picture_header(MpegEncContext *s) | |||||
| return mb_count; | return mb_count; | ||||
| } | } | ||||
| static int rv20_decode_picture_header(MpegEncContext *s) | |||||
| static int rv20_decode_picture_header(RVDecContext *rv) | |||||
| { | { | ||||
| MpegEncContext *s = &rv->m; | |||||
| int seq, mb_pos, i; | int seq, mb_pos, i; | ||||
| int rpr_bits; | int rpr_bits; | ||||
| @@ -325,10 +331,10 @@ static int rv20_decode_picture_header(MpegEncContext *s) | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| if(RV_GET_MINOR_VER(s->avctx->sub_id) >= 2) | |||||
| if(RV_GET_MINOR_VER(rv->sub_id) >= 2) | |||||
| s->loop_filter = get_bits1(&s->gb); | s->loop_filter = get_bits1(&s->gb); | ||||
| if(RV_GET_MINOR_VER(s->avctx->sub_id) <= 1) | |||||
| if(RV_GET_MINOR_VER(rv->sub_id) <= 1) | |||||
| seq = get_bits(&s->gb, 8) << 7; | seq = get_bits(&s->gb, 8) << 7; | ||||
| else | else | ||||
| seq = get_bits(&s->gb, 13) << 2; | seq = get_bits(&s->gb, 13) << 2; | ||||
| @@ -393,7 +399,7 @@ static int rv20_decode_picture_header(MpegEncContext *s) | |||||
| av_log(s->avctx, AV_LOG_DEBUG, "\n");*/ | av_log(s->avctx, AV_LOG_DEBUG, "\n");*/ | ||||
| s->no_rounding= get_bits1(&s->gb); | s->no_rounding= get_bits1(&s->gb); | ||||
| if(RV_GET_MINOR_VER(s->avctx->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B) | |||||
| if(RV_GET_MINOR_VER(rv->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B) | |||||
| skip_bits(&s->gb, 5); // binary decoder reads 3+2 bits here but they don't seem to be used | skip_bits(&s->gb, 5); // binary decoder reads 3+2 bits here but they don't seem to be used | ||||
| s->f_code = 1; | s->f_code = 1; | ||||
| @@ -418,7 +424,8 @@ av_log(s->avctx, AV_LOG_DEBUG, "\n");*/ | |||||
| static av_cold int rv10_decode_init(AVCodecContext *avctx) | static av_cold int rv10_decode_init(AVCodecContext *avctx) | ||||
| { | { | ||||
| MpegEncContext *s = avctx->priv_data; | |||||
| RVDecContext *rv = avctx->priv_data; | |||||
| MpegEncContext *s = &rv->m; | |||||
| static int done=0; | static int done=0; | ||||
| int major_ver, minor_ver, micro_ver; | int major_ver, minor_ver, micro_ver; | ||||
| @@ -438,11 +445,11 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) | |||||
| s->orig_height= s->height = avctx->coded_height; | s->orig_height= s->height = avctx->coded_height; | ||||
| s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1; | s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1; | ||||
| avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4); | |||||
| rv->sub_id = AV_RB32((uint8_t*)avctx->extradata + 4); | |||||
| major_ver = RV_GET_MAJOR_VER(avctx->sub_id); | |||||
| minor_ver = RV_GET_MINOR_VER(avctx->sub_id); | |||||
| micro_ver = RV_GET_MICRO_VER(avctx->sub_id); | |||||
| major_ver = RV_GET_MAJOR_VER(rv->sub_id); | |||||
| minor_ver = RV_GET_MINOR_VER(rv->sub_id); | |||||
| micro_ver = RV_GET_MICRO_VER(rv->sub_id); | |||||
| s->low_delay = 1; | s->low_delay = 1; | ||||
| switch (major_ver) { | switch (major_ver) { | ||||
| @@ -457,13 +464,13 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| break; | break; | ||||
| default: | default: | ||||
| av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id); | |||||
| av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", rv->sub_id); | |||||
| av_log_missing_feature(avctx, "RV1/2 version", 1); | av_log_missing_feature(avctx, "RV1/2 version", 1); | ||||
| return AVERROR_PATCHWELCOME; | return AVERROR_PATCHWELCOME; | ||||
| } | } | ||||
| if(avctx->debug & FF_DEBUG_PICT_INFO){ | if(avctx->debug & FF_DEBUG_PICT_INFO){ | ||||
| av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1); | |||||
| av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", rv->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1); | |||||
| } | } | ||||
| avctx->pix_fmt = PIX_FMT_YUV420P; | avctx->pix_fmt = PIX_FMT_YUV420P; | ||||
| @@ -498,7 +505,8 @@ static av_cold int rv10_decode_end(AVCodecContext *avctx) | |||||
| static int rv10_decode_packet(AVCodecContext *avctx, | static int rv10_decode_packet(AVCodecContext *avctx, | ||||
| const uint8_t *buf, int buf_size, int buf_size2) | const uint8_t *buf, int buf_size, int buf_size2) | ||||
| { | { | ||||
| MpegEncContext *s = avctx->priv_data; | |||||
| RVDecContext *rv = avctx->priv_data; | |||||
| MpegEncContext *s = &rv->m; | |||||
| int mb_count, mb_pos, left, start_mb_x, active_bits_size; | int mb_count, mb_pos, left, start_mb_x, active_bits_size; | ||||
| active_bits_size = buf_size * 8; | active_bits_size = buf_size * 8; | ||||
| @@ -506,7 +514,7 @@ static int rv10_decode_packet(AVCodecContext *avctx, | |||||
| if(s->codec_id ==CODEC_ID_RV10) | if(s->codec_id ==CODEC_ID_RV10) | ||||
| mb_count = rv10_decode_picture_header(s); | mb_count = rv10_decode_picture_header(s); | ||||
| else | else | ||||
| mb_count = rv20_decode_picture_header(s); | |||||
| mb_count = rv20_decode_picture_header(rv); | |||||
| if (mb_count < 0) { | if (mb_count < 0) { | ||||
| av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n"); | av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n"); | ||||
| return -1; | return -1; | ||||
| @@ -714,7 +722,7 @@ AVCodec ff_rv10_decoder = { | |||||
| .name = "rv10", | .name = "rv10", | ||||
| .type = AVMEDIA_TYPE_VIDEO, | .type = AVMEDIA_TYPE_VIDEO, | ||||
| .id = CODEC_ID_RV10, | .id = CODEC_ID_RV10, | ||||
| .priv_data_size = sizeof(MpegEncContext), | |||||
| .priv_data_size = sizeof(RVDecContext), | |||||
| .init = rv10_decode_init, | .init = rv10_decode_init, | ||||
| .close = rv10_decode_end, | .close = rv10_decode_end, | ||||
| .decode = rv10_decode_frame, | .decode = rv10_decode_frame, | ||||
| @@ -728,7 +736,7 @@ AVCodec ff_rv20_decoder = { | |||||
| .name = "rv20", | .name = "rv20", | ||||
| .type = AVMEDIA_TYPE_VIDEO, | .type = AVMEDIA_TYPE_VIDEO, | ||||
| .id = CODEC_ID_RV20, | .id = CODEC_ID_RV20, | ||||
| .priv_data_size = sizeof(MpegEncContext), | |||||
| .priv_data_size = sizeof(RVDecContext), | |||||
| .init = rv10_decode_init, | .init = rv10_decode_init, | ||||
| .close = rv10_decode_end, | .close = rv10_decode_end, | ||||
| .decode = rv10_decode_frame, | .decode = rv10_decode_frame, | ||||
| @@ -59,5 +59,8 @@ | |||||
| #ifndef FF_API_INTER_THRESHOLD | #ifndef FF_API_INTER_THRESHOLD | ||||
| #define FF_API_INTER_THRESHOLD (LIBAVCODEC_VERSION_MAJOR < 55) | #define FF_API_INTER_THRESHOLD (LIBAVCODEC_VERSION_MAJOR < 55) | ||||
| #endif | #endif | ||||
| #ifndef FF_API_SUB_ID | |||||
| #define FF_API_SUB_ID (LIBAVCODEC_VERSION_MAJOR < 55) | |||||
| #endif | |||||
| #endif /* AVCODEC_VERSION_H */ | #endif /* AVCODEC_VERSION_H */ | ||||