Message ID | 33ad72ef20383b4a86526c511696ed0838afa10b.1623972511.git.deborahbrouwer3563@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cec: One Touch Record tests | expand |
On 18/06/2021 01:41, Deborah Brouwer wrote: > Check that the follower ignores the Record TV Screen message if the > initiator has a logical address other than Record or Backup (aka Reserved > in CEC Version < 2.0). If the follower replies correctly, check that the > source operand is valid. > > Signed-off-by: Deborah Brouwer <deborahbrouwer3563@gmail.com> > --- > utils/cec-compliance/cec-test.cpp | 53 ++++++++++++++++++++++++++----- > utils/cec-follower/cec-tuner.cpp | 9 ++++-- > 2 files changed, 51 insertions(+), 11 deletions(-) > > diff --git a/utils/cec-compliance/cec-test.cpp b/utils/cec-compliance/cec-test.cpp > index 40d8369d..0051d72a 100644 > --- a/utils/cec-compliance/cec-test.cpp > +++ b/utils/cec-compliance/cec-test.cpp > @@ -1150,13 +1150,6 @@ static const vec_remote_subtests tuner_ctl_subtests{ > > static int one_touch_rec_tv_screen(struct node *node, unsigned me, unsigned la, bool interactive) > { > - /* > - TODO: > - - Page 36 in HDMI CEC 1.4b spec lists additional behaviors that should be > - checked for. > - - The TV should ignore this message when received from other LA than Recording or > - Reserved. > - */ > struct cec_msg msg; > > cec_msg_init(&msg, me, la); > @@ -1172,8 +1165,52 @@ static int one_touch_rec_tv_screen(struct node *node, unsigned me, unsigned la, > return OK_REFUSED; > if (cec_msg_status_is_abort(&msg)) > return OK_PRESUMED; > + /* > + * Follower should ignore this message if initiator has a logical > + * address other than Record or Backup (aka "Reserved" in CEC Version < 2.0). > + */ > + if (!cec_has_record(1 << me) && !cec_has_backup(1 << me)) { > + fail_on_test(!timed_out(&msg)); > + return OK; > + } > + fail_on_test(timed_out(&msg)); > > - return 0; > + struct cec_op_record_src rec_src = {}; > + > + cec_ops_record_on(&msg, &rec_src); > + > + if (rec_src.type < 1 || rec_src.type > 5) Don't use the numbers, use the corresponding defines (CEC_OP_RECORD_SRC_OWN and CEC_OP_RECORD_SRC_EXT_PHYS_ADDR). > + return fail("Invalid source.\n"); > + > + if (rec_src.type == CEC_OP_RECORD_SRC_DIGITAL && > + rec_src.digital.service_id_method == CEC_OP_SERVICE_ID_METHOD_BY_DIG_ID) { > + > + switch (rec_src.digital.dig_bcast_system) { > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_T: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_C: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S2: > + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_T: > + break; > + default: > + return fail("Invalid digital service broadcast system operand.\n"); > + } > + } > + > + if (rec_src.type == CEC_OP_RECORD_SRC_ANALOG) { > + fail_on_test(rec_src.analog.ana_bcast_type > 2); Ditto here... > + fail_on_test(rec_src.analog.bcast_system > 8 && rec_src.analog.bcast_system != 0x1f); ...and here. Regards, Hans > + } > + > + return OK; > } > > static int one_touch_rec_on(struct node *node, unsigned me, unsigned la, bool interactive) > diff --git a/utils/cec-follower/cec-tuner.cpp b/utils/cec-follower/cec-tuner.cpp > index b9c21684..fd11bd10 100644 > --- a/utils/cec-follower/cec-tuner.cpp > +++ b/utils/cec-follower/cec-tuner.cpp > @@ -583,9 +583,6 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns > This is only a basic implementation. > > TODO: > - - If we are a TV, we should only send Record On if the > - remote end is a Recording device or Reserved. Otherwise ignore. > - > - Device state should reflect whether we are recording, etc. In > recording mode we should ignore Standby messages. > */ > @@ -594,6 +591,12 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns > if (!node->has_rec_tv) > break; > > + __u8 la = cec_msg_initiator(&msg); > + > + /* Ignore if initiator is not Record or Backup (aka "Reserved" in CEC Version < 2.0) */ > + if (!cec_has_record(1 << la) && !cec_has_backup(1 << la)) > + return; > + > struct cec_op_record_src rec_src = {}; > > rec_src.type = CEC_OP_RECORD_SRC_OWN; >
diff --git a/utils/cec-compliance/cec-test.cpp b/utils/cec-compliance/cec-test.cpp index 40d8369d..0051d72a 100644 --- a/utils/cec-compliance/cec-test.cpp +++ b/utils/cec-compliance/cec-test.cpp @@ -1150,13 +1150,6 @@ static const vec_remote_subtests tuner_ctl_subtests{ static int one_touch_rec_tv_screen(struct node *node, unsigned me, unsigned la, bool interactive) { - /* - TODO: - - Page 36 in HDMI CEC 1.4b spec lists additional behaviors that should be - checked for. - - The TV should ignore this message when received from other LA than Recording or - Reserved. - */ struct cec_msg msg; cec_msg_init(&msg, me, la); @@ -1172,8 +1165,52 @@ static int one_touch_rec_tv_screen(struct node *node, unsigned me, unsigned la, return OK_REFUSED; if (cec_msg_status_is_abort(&msg)) return OK_PRESUMED; + /* + * Follower should ignore this message if initiator has a logical + * address other than Record or Backup (aka "Reserved" in CEC Version < 2.0). + */ + if (!cec_has_record(1 << me) && !cec_has_backup(1 << me)) { + fail_on_test(!timed_out(&msg)); + return OK; + } + fail_on_test(timed_out(&msg)); - return 0; + struct cec_op_record_src rec_src = {}; + + cec_ops_record_on(&msg, &rec_src); + + if (rec_src.type < 1 || rec_src.type > 5) + return fail("Invalid source.\n"); + + if (rec_src.type == CEC_OP_RECORD_SRC_DIGITAL && + rec_src.digital.service_id_method == CEC_OP_SERVICE_ID_METHOD_BY_DIG_ID) { + + switch (rec_src.digital.dig_bcast_system) { + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_T: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_C: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S2: + case CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_T: + break; + default: + return fail("Invalid digital service broadcast system operand.\n"); + } + } + + if (rec_src.type == CEC_OP_RECORD_SRC_ANALOG) { + fail_on_test(rec_src.analog.ana_bcast_type > 2); + fail_on_test(rec_src.analog.bcast_system > 8 && rec_src.analog.bcast_system != 0x1f); + } + + return OK; } static int one_touch_rec_on(struct node *node, unsigned me, unsigned la, bool interactive) diff --git a/utils/cec-follower/cec-tuner.cpp b/utils/cec-follower/cec-tuner.cpp index b9c21684..fd11bd10 100644 --- a/utils/cec-follower/cec-tuner.cpp +++ b/utils/cec-follower/cec-tuner.cpp @@ -583,9 +583,6 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns This is only a basic implementation. TODO: - - If we are a TV, we should only send Record On if the - remote end is a Recording device or Reserved. Otherwise ignore. - - Device state should reflect whether we are recording, etc. In recording mode we should ignore Standby messages. */ @@ -594,6 +591,12 @@ void process_tuner_record_timer_msgs(struct node *node, struct cec_msg &msg, uns if (!node->has_rec_tv) break; + __u8 la = cec_msg_initiator(&msg); + + /* Ignore if initiator is not Record or Backup (aka "Reserved" in CEC Version < 2.0) */ + if (!cec_has_record(1 << la) && !cec_has_backup(1 << la)) + return; + struct cec_op_record_src rec_src = {}; rec_src.type = CEC_OP_RECORD_SRC_OWN;
Check that the follower ignores the Record TV Screen message if the initiator has a logical address other than Record or Backup (aka Reserved in CEC Version < 2.0). If the follower replies correctly, check that the source operand is valid. Signed-off-by: Deborah Brouwer <deborahbrouwer3563@gmail.com> --- utils/cec-compliance/cec-test.cpp | 53 ++++++++++++++++++++++++++----- utils/cec-follower/cec-tuner.cpp | 9 ++++-- 2 files changed, 51 insertions(+), 11 deletions(-)