Guest User

Untitled

a guest
Oct 23rd, 2017
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.91 KB | None | 0 0
  1. From d88acac0c1cd91aaf7d894dff4176f7d32d36b45 Mon Sep 17 00:00:00 2001
  2. From: Mashiat Sarker <shahriman_ams@yahoo.com>
  3. Date: Sun, 26 Jun 2011 21:20:27 +0600
  4. Subject: [PATCH] Field picture header parsing 01
  5.  
  6. ---
  7. libavcodec/vc1.c | 81 ++++++++++++++++++++++++++++++++++++---------------
  8. libavcodec/vc1.h | 3 ++
  9. libavcodec/vc1dec.c | 4 ++
  10. 3 files changed, 64 insertions(+), 24 deletions(-)
  11.  
  12. diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
  13. index 0884428..c37e431 100644
  14. --- a/libavcodec/vc1.c
  15. +++ b/libavcodec/vc1.c
  16. @@ -452,6 +452,7 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
  17. v->s.avctx->height = v->s.avctx->coded_height;
  18. v->broadcast = get_bits1(gb);
  19. v->interlace = get_bits1(gb);
  20. + if (v->interlace) v->second_field = 0;
  21. v->tfcntrflag = get_bits1(gb);
  22. v->finterpflag = get_bits1(gb);
  23. skip_bits1(gb); // reserved
  24. @@ -797,6 +798,13 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
  25. int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab; /* useful only for debugging */
  26.  
  27. v->p_frame_skipped = 0;
  28. + if (v->second_field) {
  29. + v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
  30. + if (v->fptype & 4)
  31. + v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
  32. + av_log(s->avctx, AV_LOG_DEBUG, "Field 2: AV_PICTURE_TYPE_* = %d\n", v->s.pict_type);
  33. + goto parse_field;
  34. + }
  35.  
  36. if(v->interlace){
  37. v->fcm = decode012(gb);
  38. @@ -806,30 +814,37 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
  39. }
  40. }
  41.  
  42. - switch(get_unary(gb, 0, 4)) {
  43. - case 0:
  44. - v->s.pict_type = AV_PICTURE_TYPE_P;
  45. - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_P\n");
  46. - break;
  47. - case 1:
  48. - v->s.pict_type = AV_PICTURE_TYPE_B;
  49. - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_B\n");
  50. - break;
  51. - case 2:
  52. - v->s.pict_type = AV_PICTURE_TYPE_I;
  53. - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_I\n");
  54. - break;
  55. - case 3:
  56. - v->s.pict_type = AV_PICTURE_TYPE_BI;
  57. - av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_BI\n");
  58. - break;
  59. - case 4:
  60. - v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
  61. - v->p_frame_skipped = 1;
  62. - av_log(v->s.avctx, AV_LOG_DEBUG, "Skipped Picture\n");
  63. - return 0;
  64. + if (v->fcm == 2) {
  65. + v->fptype = get_bits(gb, 3);
  66. + av_log(s->avctx, AV_LOG_DEBUG, "FPTYPE: %d\n", v->fptype);
  67. + v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
  68. + if (v->fptype & 4) // B-picture
  69. + v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
  70. + } else {
  71. + switch(get_unary(gb, 0, 4)) {
  72. + case 0:
  73. + v->s.pict_type = AV_PICTURE_TYPE_P;
  74. + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_P\n");
  75. + break;
  76. + case 1:
  77. + v->s.pict_type = AV_PICTURE_TYPE_B;
  78. + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_B\n");
  79. + break;
  80. + case 2:
  81. + v->s.pict_type = AV_PICTURE_TYPE_I;
  82. + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_I\n");
  83. + break;
  84. + case 3:
  85. + v->s.pict_type = AV_PICTURE_TYPE_BI;
  86. + av_log(v->s.avctx, AV_LOG_DEBUG, "AV_PICTURE_TYPE_BI\n");
  87. + break;
  88. + case 4:
  89. + v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
  90. + v->p_frame_skipped = 1;
  91. + av_log(v->s.avctx, AV_LOG_DEBUG, "Skipped Picture\n");
  92. + return 0;
  93. + }
  94. }
  95. -
  96. if(v->tfcntrflag)
  97. skip_bits(gb, 8);
  98. if(v->broadcast) {
  99. @@ -847,6 +862,22 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
  100. v->rnd = get_bits1(gb);
  101. if(v->interlace)
  102. v->uvsamp = get_bits1(gb);
  103. + if (v->fcm == 2) {
  104. + if (!v->refdist_flag) v->refdist = 0;
  105. + else {
  106. + if ((v->s.pict_type != AV_PICTURE_TYPE_B)
  107. + && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
  108. + v->refdist = get_bits(gb, 2);
  109. + if (val == 3) v->refdist += get_unary(gb, 0, 16);
  110. + av_log(s->avctx, AV_LOG_DEBUG, "REFDIST: %d\n", v->refdist);
  111. + } else {
  112. + v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
  113. + v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
  114. + av_log(s->avctx, AV_LOG_DEBUG, "BFRACTION: %d\n", v->bfraction);
  115. + }
  116. + }
  117. + goto parse_field;
  118. + }
  119. if(v->finterpflag) v->interpfrm = get_bits1(gb);
  120. if(v->s.pict_type == AV_PICTURE_TYPE_B) {
  121. v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
  122. @@ -855,6 +886,8 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
  123. v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
  124. }
  125. }
  126. +
  127. + parse_field:
  128. pqindex = get_bits(gb, 5);
  129. if(!pqindex) return -1;
  130. v->pqindex = pqindex;
  131. @@ -890,7 +923,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
  132. if (status < 0) return -1;
  133. av_log(v->s.avctx, AV_LOG_DEBUG, "FIELDTX plane encoding: "
  134. "Imode: %i, Invert: %i\n", status>>1, status&1);
  135. - }
  136. + }
  137. status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
  138. if (status < 0) return -1;
  139. av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
  140. diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h
  141. index 1b34f63..001eae8 100644
  142. --- a/libavcodec/vc1.h
  143. +++ b/libavcodec/vc1.h
  144. @@ -336,6 +336,9 @@ typedef struct VC1Context{
  145. int8_t zzi_8x8[64];
  146. uint8_t *blk_mv_type_base, *blk_mv_type; ///< 0: frame MV, 1: field MV
  147. int frame_num; // keeps count of frame (debugging)
  148. + int fptype;
  149. + int second_field;
  150. + int refdist; ///< distance of the current picture from reference
  151.  
  152. /** Frame decoding info for sprite modes */
  153. //@{
  154. diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
  155. index 28b0c49..4964ef7 100644
  156. --- a/libavcodec/vc1dec.c
  157. +++ b/libavcodec/vc1dec.c
  158. @@ -4293,6 +4293,10 @@ static int vc1_decode_frame(AVCodecContext *avctx,
  159. buf_start = start;
  160. buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
  161. break;
  162. + case VC1_CODE_FIELD:
  163. + buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
  164. + v->second_field = 1;
  165. + break;
  166. case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
  167. buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
  168. init_get_bits(&s->gb, buf2, buf_size2*8);
  169. --
  170. 1.7.4.1
Add Comment
Please, Sign In to add comment